javascript - Safari 扩展 - 消息

标签 javascript safari safari-extension

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

我已经能够毫无问题地将 jQuery 加载到页面中,但是当涉及到从扩展栏向 injected.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>

注入(inject).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 但我仍然没有得到我正在寻找的结果为。

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

最佳答案

在全局页面的 test 函数中,event 不引用任何东西,因为该函数不是事件处理程序。如果您想定位事件标签,请改用此标签:

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

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

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

如果您想从注入(inject)的脚本向全局页面或扩展栏发送消息,请使用 safari.self.tab.dispatchMessage 并在全局页面或扩展栏。

关于javascript - Safari 扩展 - 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11994266/

相关文章:

javascript - 如何在 Safari 中安装扩展后访问 DOM

javascript - 从对象数组中减去对象数组

php - 当我们在PHP中选择ID时自动显示价格

javascript - 当我点击 navigationOptions 中的按钮时,为什么没有正确设置 React Native 状态?

javascript - Safari/iOS 中 'download' 属性的替代方法

safari-extension - 安装扩展程序时 Safari 会触发消息吗?

javascript - 将钩子(Hook)置于某种状态

CSS 显示 :content not working in Safari

javascript - onclick ="location.href=' link.html'"在 Safari 中不加载页面

browser - 是否有放大尺来测量像素?