这是我的第一个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模式添加到白名单。我的扩展程序仅在我想要的页面上触发,我可以使用消息。
在全局页面中的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
并在全局页面或扩展栏中放置“message”事件处理程序。