![](https://help.apple.com/assets/645D5D228BE0233D28263F4B/645D5D248BE0233D28263F53/zh_CN/fbd8d40651fff19a46e7aaedd4cb1b09.png)
Mac 上“快捷指令”中的“在网页上运行 JavaScript”操作介绍
几乎所有网页的脚本都使用 JavaScript,这一编程语言可在网页浏览器内创建动态效果,包括动画、交互式菜单、视频播放等。浏览网站时,JavaScript 通常不会显示。但是你可以控制网页的 JavaScript,方法是构建包含“在网页上运行 JavaScript”操作的快捷指令,然后在 Safari 浏览器 App 中运行该快捷指令。
在网页上运行自定义 JavaScript 的快捷指令有多种用途。例如,你可以创建快捷指令以从网页取回特定数据并将该数据整合到任务中,如提取课程安排后将其添加到“日历” App,或者导出社交媒体群组的成员数据后将该数据添加到电子表格。
你还可以创建可修改网页的快捷指令,如更改网页文本的字体或修改视频的播放速度。你必须先启用设置,才能从快捷指令运行 JavaScript。请参阅Mac 上“快捷指令”中的高级隐私和安全性设置。
有关使用在网页上运行 JavaScript 的快捷指令的信息,请参阅在 Mac 上的“快捷指令”中使用“在网页上运行 JavaScript”操作。
关于取回网页数据
“在网页上运行 JavaScript”操作可让你从网页取回数据,方法是抓取符合特定条件的所有元素,然后循环访问这些元素以使用数据执行任务(或进一步检查元素)。
例如,若要为网页上的每个图像元素创建一个列表,请使用:
var elements = document.querySelectorAll("img");
再如,若要使用“post”类取回每个元素,请使用:
var elements = document.querySelectorAll(".post");
NodeList 创建后,你可以使用如下示例循环访问这些元素(以进一步过滤元素或将元素添加到数据结构):
var elements = ...;
for (let element of elements) {
// ...
}
有关查询网页结果的更多信息,请参阅 https://developer.mozilla.org/Selectors 和 https://developer.mozilla.org/SelectorAll。
“在网页上运行 JavaScript”操作的输入
“在网页上运行 JavaScript”操作的输入必须为活跃的 Safari 浏览器网页,这意味着你必须从共享表单中运行快捷指令(具体而言,即从 Safari 浏览器、SFSafariViewController 或 ASWebAuthenticationSession 中运行)。
当从共享表单运行快捷指令时,来自 Safari 浏览器 App 的输入会传入快捷指令中的第一个操作。
虽然“在网页上运行 JavaScript”操作的输入必须为 Safari 浏览器网页,你也可以使用魔法变量在操作中插入其他数据。例如,更改视频速度快捷指令(“快捷指令中心”中提供)包含“在网页上运行 JavaScript”操作,可修改网页上的视频。视频的播放速率由“速度”变量控制。
有关从 Safari 浏览器运行快捷指令的信息,请参阅在 Mac 上工作时运行快捷指令。
“在网页上运行 JavaScript”操作的输出
若要返回数据,你必须在 JavaScript 中调用完成处理程序,如 completion(result)
。由于 JavaScript 通常与异步模式配合使用,所以调用也不同步。这样,你可以异步完成操作。如下所示为有效调用:
window.setTimeout(function() {
completion(true);
}, 1000);
“在网页上运行 JavaScript”操作可以输出任何有效的 JSON 数据类型,包括:
字符串
数字
布尔值(真或假)
数组(包含其他任何有效的 JSON 类型)
词典(包含其他任何有效的 JSON 类型)
Null
Undefined
“快捷指令”在后台自动对你的返回值进行编码和解码,以在 JavaScript 和“快捷指令” App 间进行通信。这意味着你无需在调用完成处理程序之前调用 JSON.stringify(result)
。
由于返回值为 JSON,部分返回值可能无效。例如,函数或 Node 将不会有可用的 JSON 已编码形式。在这种情况下,建议你创建包含所需的兼容 JSON 的值的数组/词典。
【注】JavaScript 中的对象只是一个词典,所以基本对象也会转换为 JSON。
如果不想要“在网页上运行 JavaScript”操作返回任何数据,你可以调用没有任何参数的 completion()
函数(因为 undefined
为有效输出)。这与调用 completion(undefined)
的结果相同。
有关 JSON 的更多信息,请参阅在 Mac 上的“快捷指令”中使用 JSON 的介绍。
有关 Node 的更多信息,请访问 https://developer.mozilla.org/Node。
有关函数的更多信息,请访问 https://developer.mozilla.org/Functions。
“在网页上运行 JavaScript”操作的时间限制
如同 Safari 浏览器中的所有 JavaScript 扩展一样,“在网页上运行 JavaScript”操作也有时间限制,因此需要尽快完成。使用诸如以下同步函数的 JavaScript 可能无法及时完成:
window.alert()
window.prompt()
window.confirm()
超时持续多秒,例如:
window.setTimeout(function() { completion(); }, 5000);
如果 JavaScript 运行超过时间限制,快捷指令将无法完成,并在运行时显示一则“JavaScript 超时”的错误信息。
语法和运行时错误处理
你可以使用 Safari 浏览器支持的任何语法在“在网页上运行 JavaScript”操作中编写 JavaScript。
在“快捷指令” App 中,“在网页上运行 JavaScript”操作在你从 Safari 浏览器扩展运行快捷指令前会执行基本的语法检查来帮助你发现错误。
在文本栏中输入脚本时,语法会高亮显示,有助于确保 JavaScript 的有效性。例如,如果你忘记在字符串末尾添加引号,该字符串之后的所有文本都会高亮显示。
如果脚本的语法有效但包含一个运行时错误,“在网页上运行 JavaScript”操作会抓取并显示异常。例如,如果脚本引用的变量或函数不存在(如 shortcuts.completion()
),则运行时会显示错误。