这是我的第一个 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 模式添加到白名单。我的扩展只在我想要的页面上触发,我可以使用消息。