【发布时间】:2019-03-24 19:29:14
【问题描述】:
这是我的第一个 Safari 扩展程序,到目前为止,我喜欢它安静一点。我正在尝试添加一个扩展栏,它与注入的.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
只是为了看看这是我的错误还是开发页面上的一些愚蠢的东西,我在他们的页面上复制了确切的代码,只使用了 Global HTML 和 Injected.js,但我仍然没有得到我正在寻找的结果为。
已解决: 我选择的答案确实适用于我遇到的问题。这不是每个人的确切答案,但确实如此,与 cmets 一起帮助我理顺我的代码。为了让各种扩展组件正确发送消息,我需要将扩展远程访问设置为全部,然后将 URL 模式添加到白名单。我的扩展只在我想要的页面上触发,我可以使用消息。
【问题讨论】:
标签: javascript safari safari-extension