2

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

我已经能够将 jQuery 加载到页面中没有问题,但是当谈到从扩展栏发送消息到注入的.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>

注入的.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,但我仍然没有得到我想要的结果。

已解决:我选择的答案确实适用于我遇到的问题。这不是每个人的确切答案,但确实如此,以及评论帮助我理顺了我的代码。为了让各种扩展组件正确发送消息,我需要将扩展​​远程访问设置为全部,然后将 URL 模式添加到白名单。我的扩展只在我想要的页面上触发,我可以使用消息。

4

1 回答 1

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并拥有一个“消息”事件处理程序。

于 2012-08-17T17:29:21.617 回答