我尝试使用JXA访问名为Papers3的应用中的对象属性。我是JXA的新手,这证明是具有挑战性的,特别是因为缺乏文档。
以下是我试图查看
的对象字典的镜头我试图获取应用中当前显示的窗口的ID。
我的尝试是:
var Papers = Application('Papers');
Papers.includeStandardAdditions = true
Papers.libraryWindow.displayedPublications()
运行它会抛出错误,输出为:
Error on line 4: TypeError: Papers.libraryWindow.displayedPublications is not a function. (In 'Papers.libraryWindow.displayedPublications()', 'Papers.libraryWindow.displayedPublications' is undefined)
Error -2700: Script error.
另外,如果我只打电话给Papers.libraryWindow
结果是:
[function anonymous] {
"name":"",
"prototype":{"constructor":[function anonymous]}
}
我不确定该怎么做。
答案 0 :(得分:2)
我认为这是一个小细节。 libraryWindow
需要是复数,并且必须指定哪一个。您可以使用多种形式:
libraryWindows[0]
ByName 例如。 libraryWindows.byName('Papers')
因此,要访问第一个库窗口,请使用:libraryWindows[0]
。
试试这个:
(() => {
'use strict'
const app = Application('Papers');
const oWin = app.libraryWindows[0]
return oWin.displayedPublications()
})();
答案 1 :(得分:1)
好吧,JXA破坏了混淆的垂死垃圾和AS也没有太大的好处,但要理解的关键是Apple事件IPC 不 OOP,它是 RPC +简单一流的关系查询。尽管有语法糖,但它最接近的实际上是SQL数据库编程,而不是浏览器DOM操作,所以一旦你了解它,它[希望]开始变得更有意义。
“AppleScriptable”应用程序将其数据显示为严格抽象的关系图 - “Apple事件对象模型” - 其中每个节点通过一对一和/或一对多关系与其他节点相关联。在OO意义上没有“类”或“对象”这样的东西;它只是附加用于文档目的的行话。因此,应用程序的字典称为“属性”的是包含原始值的简单属性(数字,字符串,列表等;例如Finder name
的{{1}}属性)或者是一个 - 一段关系(例如iTunes“file
”的current track
属性,以及它所谓的“元素”是一对多关系(在您的情况下,application
元素论文'libraryWindows
对象)。
例如,application
应该返回论文中每个库窗口的显示出版物列表(尽管实际上是否真的有效取决于应用程序的AEOM的实现程度,更不用说JXA自己的实施问题了);或者你可以使用各种参考表格(按索引,按名称等;虽然JXA中有几个被破坏/不支持)以缩小你的查询,比如,只是第一个库窗口,例如Papers.libraryWindows.displayedPublications.get()
。
您可能会从浏览NodeAutomation文档中获得一些见解,其中包括rough overview of AEOM以及如何组装查询,然后通过命令(远程过程调用)将其发送给它,以便在其认为合适时进行解析和处理。 JXA语法不是很漂亮,各种操作在JXA的AS barf中完美运行,但它会给你一个粗略的想法。
那就是说,我强烈建议坚持使用AppleScript。语言很乱,但至少它有一些文档和用户社区来帮助你找到解决方法(即使他们也不深入理解它)。
答案 2 :(得分:0)
对于论文3特定的JXA示例,请参阅:
mac-scripting - Automation scripts for macOS
有关更多常规信息,请参阅:
JXA Resources