使用 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 中使用 windowdocument 来更改 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)
}

有关详细信息,请参阅: