我正在设计一个safari应用程序,并且发现我需要能够将数据从全局页面发送到注入的脚本,并在阅读Apple文档后发现我将需要使用消息。
最初,我试着写信息来做我想要的事情但失败了。然后,我简化了代码,只发送一条基本消息,但也失败了。在将其缩小到我认为错误之后,这是我尝试的代码:
Global.html:
<!DOCTYPE html>
<head>
</head>
<body>
<script type="text/javascript" charset="utf-8">
// Set up the Listener
safari.application.addEventListener("command", performCommand, false);
// Function to perform when event is received
function performCommand(event) {
// Make sure event comes from the button
if (event.command == "parseGrades") {
alert('made it');
safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("execute", "engage");
}
}
</script>
</body>
</html>
Inject.js:
safari.self.addEventListener("message", handleMessage, false);
function handleMessage(msgEvent) {
alert('message received');
}
当我运行扩展程序时,我收到一条警告,上面写着“成功”,但我从未收到“收到邮件”的警报(这是我想要的)。
就扩展设置本身而言,我将网站访问权限设置为all并包含安全页面,并将global.html设置为全局页面,将Inject.js设置为结束脚本。
我还尝试将Inject.js设置为启动脚本,但与将其设置为结束脚本具有相同的效果,因此我将其更改为结束脚本。
我用以下内容交叉引用:
基于这些来源,在我看来它应该有效,但我显然是错的:)。
答案 0 :(得分:1)
这似乎是因为Safari缓存了页面的扩展脚本,从而阻止了邮件的接收。
这是错误:
undefined is not an object (evaluating 'safari.application.activeBrowserWindow.activeTab.page.dispatchMessage)
这可能意味着safari.application.activeBrowserWindow
不存在,因为注入的脚本实际上没有注入,因此没有任何内容可以发送消息。
重新启动Safari似乎可以解决问题。