使用 JXA 从选定文本/突出显示的文本中获取字符串
Get the string from selected text/ highlighted text using JXA
我是新来的 Javascript 和 JXA,如果我提出了一些愚蠢的问题,请原谅我。但我正在尝试找出一种使用 JXA 从突出显示的文本中获取字符串的方法 - JavaScript 用于自动化,因为 Javascript 可以在 Automator 中识别,因为 Yosemite,我想我可以用这些做一些事情:
window.getSelection
在:
function getSelectedText() {
if (window.getSelection) {
txt = window.getSelection();
} else if (window.document.getSelection) {
txt =window.document.getSelection();
} else if (window.document.selection) {
txt = window.document.selection.createRange().text;
}
return txt;
}
此代码不是我的,有人发布的。但我发现我不能在 Automator 中使用 window
或 document
来更改 Mac OS,所以有人可以告诉我如何转换它Javascript Automator 能看懂的JXA 代码?
非常感谢!
不要那样做,它仅适用于嵌入网络浏览器中的 JavaScript。 JXA 是一个独立的 JS 解释器,它完全不了解网页或 DOM(坦率地说,对 Mac 应用程序脚本也没有太多了解,顺便说一句)。
相反,使用 Automator 创建一个 OS X Service,因为服务可以在几乎任何 OS X 应用程序中操作选定的文本;无需应用程序脚本。
你需要混合使用 JXA 和 Safari 的 javaScript…
var Safari = Application("Safari") // get Safari
selection = Safari.doJavaScript("document.getSelection().toString()",{
in: Safari.windows[0].tabs[0] // assume frontmost window and tab
})
脚本在 JXA 中,但 document.getSelection().toString() 是 Safari 的 javaScript.
当然你需要在 Safari 中启用苹果事件…http://osxdaily.com/2011/11/03/enable-the-develop-menu-in-safari/
如果您想要从另一个应用程序中选择文本,代码可能会有很大不同。
一般来说,您可以使用系统事件应用程序与任何应用程序进行复制和粘贴。
'use strict';
//--- GET A REF TO CURRENT APP WITH STD ADDITONS ---
var app = Application.currentApplication()
app.includeStandardAdditions = true
var seApp = Application('System Events')
//--- Set the Clipboard so we can test for no selection ---
app.setTheClipboardTo("[NONE]")
//--- Activate the App to COPY the Selection ---
var safariApp = Application("Safari")
safariApp.activate()
delay(0.2) // adjust the delay as needed
//--- Issue the COPY Command ---
seApp.keystroke('c', { using: 'command down' }) // Press ⌘C
delay(0.2) // adjust the delay as needed
//--- Get the Text on the Clipboard ---
var clipStr = app.theClipboard()
console.log(clipStr)
//--- Display Alert if NO Selection was Made ---
if (clipStr === "[NONE]") {
var msgStr = "NO Selection was made"
console.log(msgStr)
app.activate()
app.displayAlert(msgStr)
}
有关详细信息,请参阅:
我是新来的 Javascript 和 JXA,如果我提出了一些愚蠢的问题,请原谅我。但我正在尝试找出一种使用 JXA 从突出显示的文本中获取字符串的方法 - JavaScript 用于自动化,因为 Javascript 可以在 Automator 中识别,因为 Yosemite,我想我可以用这些做一些事情:
window.getSelection
在:
function getSelectedText() {
if (window.getSelection) {
txt = window.getSelection();
} else if (window.document.getSelection) {
txt =window.document.getSelection();
} else if (window.document.selection) {
txt = window.document.selection.createRange().text;
}
return txt;
}
此代码不是我的,有人发布的。但我发现我不能在 Automator 中使用 window
或 document
来更改 Mac OS,所以有人可以告诉我如何转换它Javascript Automator 能看懂的JXA 代码?
非常感谢!
不要那样做,它仅适用于嵌入网络浏览器中的 JavaScript。 JXA 是一个独立的 JS 解释器,它完全不了解网页或 DOM(坦率地说,对 Mac 应用程序脚本也没有太多了解,顺便说一句)。
相反,使用 Automator 创建一个 OS X Service,因为服务可以在几乎任何 OS X 应用程序中操作选定的文本;无需应用程序脚本。
你需要混合使用 JXA 和 Safari 的 javaScript…
var Safari = Application("Safari") // get Safari
selection = Safari.doJavaScript("document.getSelection().toString()",{
in: Safari.windows[0].tabs[0] // assume frontmost window and tab
})
脚本在 JXA 中,但 document.getSelection().toString() 是 Safari 的 javaScript.
当然你需要在 Safari 中启用苹果事件…http://osxdaily.com/2011/11/03/enable-the-develop-menu-in-safari/
如果您想要从另一个应用程序中选择文本,代码可能会有很大不同。
一般来说,您可以使用系统事件应用程序与任何应用程序进行复制和粘贴。
'use strict';
//--- GET A REF TO CURRENT APP WITH STD ADDITONS ---
var app = Application.currentApplication()
app.includeStandardAdditions = true
var seApp = Application('System Events')
//--- Set the Clipboard so we can test for no selection ---
app.setTheClipboardTo("[NONE]")
//--- Activate the App to COPY the Selection ---
var safariApp = Application("Safari")
safariApp.activate()
delay(0.2) // adjust the delay as needed
//--- Issue the COPY Command ---
seApp.keystroke('c', { using: 'command down' }) // Press ⌘C
delay(0.2) // adjust the delay as needed
//--- Get the Text on the Clipboard ---
var clipStr = app.theClipboard()
console.log(clipStr)
//--- Display Alert if NO Selection was Made ---
if (clipStr === "[NONE]") {
var msgStr = "NO Selection was made"
console.log(msgStr)
app.activate()
app.displayAlert(msgStr)
}
有关详细信息,请参阅: