Safari扩展 - 消息

时间:2012-08-16 19:39:09

标签: javascript safari safari-extension

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

我已经能够将jQuery加载到页面中没有问题,但是当它从扩展栏向inject.js发送消息时,我正在做空。我今天花了8个多小时来审查Apple上的开发者页面。我唯一能做的就是

分机栏:

<!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

只是为了看看我的错误或者开发页面上的一些愚蠢我在他们的页面上复制了确切的代码并仅使用了全局HTML和Injected.js而我仍然没有得到我正在寻找的结果对

解决: 我选择的答案确实对我所遇到的问题有很大帮助。这不是每个人说的确切答案,但确实如此,以及评论帮助我理顺我的代码。为了使各种扩展组件正确地发送消息,我需要将Extension Remote Access设置为All,然后将URL模式添加到白名单。我的扩展程序仅在我想要的页面上触发,我可以使用消息。

1 个答案:

答案 0 :(得分:1)

在全局页面的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并在全局页面或扩展栏中设置“消息”事件处理程序。