Safari扩展-消息



这是我的第一个Safari扩展,到目前为止我有点喜欢它的安静。我正在尝试添加一个扩展栏,该扩展栏与injected.js页面交互,并通过jquery.thoggle()切换页面上的项目;

我已经能够毫无问题地将jQuery加载到页面中,但是当涉及到从扩展栏向injected.js发送消息时,我做不到。我今天花了8个多小时复习苹果的开发者页面。我唯一能做的就是

扩展栏:

<!DOCTYPE html>
<html>
<head>
    <title>Board Tools</title> <!-- Extension Bar -->
    <script type="text/javascript" src="jQuery.min.js"></script>
    <script type="text/javascript">
        const myGlobal = safari.extension.globalPage.contentWindow;
    function ToggleBoard(){ 
        myGlobal.test();    
    }
</script>
</head>
<body>
    <input type="button" id="board" value="Board Toggle" onClick="ToggleBoard();">
</body>
</html>

全局HTML:

<!DOCTYPE HTML>
<html>
<head>
    <title>global page</title>
    <script type="text/javascript">
        function test() {
            alert("1");
            event.target.page.dispatchMessage("test", "test");
            alert("2");
    }
   </script>
</head>
<body> </body>
</html>

Injected.js:

function test(msgEvent) {
    alert(msgEvent.name);
}
// register for message events
safari.self.addEventListener("message", test, false);

我可以从扩展栏调用ToggleBoard.()函数。ToggleBoard()函数可以从全局HTML中调用test()函数。当在全局HTML页面上调用test()函数时,第一个警报会触发,第二个则不会。至少到目前为止,我已经缩小了范围。我明白我试图发送信息的方式可能是错误的,但这就是这里所说的:https://developer.apple.com/library/archive/documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html#//apple_ref/doc/uid/TP40009977-CH14-SW1

只是想看看这是我的错误还是开发页面上的错误,我在他们的页面上复制了确切的代码,只使用了Global HTML和Injected.js,但我仍然没有得到我想要的结果。

已解决:我选择的答案确实适用于我所遇到的问题。这不是每个人说的确切答案,但它确实做到了,加上注释帮助我理清了代码。为了让各种扩展组件正确地发送消息,我需要将extension Remote Access设置为All,然后将URL模式添加到白名单中。我的扩展只在我想要的页面上启动,我可以使用消息。

在全局页面中的test函数中,event不引用任何内容,因为该函数不是事件处理程序。如果你想以活动选项卡为目标,请使用以下选项:

safari.application.activeBrowserWindow.activeTab.page.dispatchMessage('test, 'test');

稍后,如果您发现希望扩展栏或全局页面响应来自注入脚本的消息,您可以在任意位置添加类似的内容:

safari.application.addEventListener('message', function (e) {
    if (e.name === 'whatever') {
        e.target.page.dispatchMessage('foo', 'bar');
    }
}, false);

如果要从注入的脚本向全局页面或扩展栏发送消息,请使用safari.self.tab.dispatchMessage,并在全局页面或延伸栏中设置"消息"事件处理程序。