在弹出窗口中重复使用基于消息的内容脚本代码的一种简单方法是将safari.self.tab.dispatchMessage
调用包装在一个抽象函数中,我将在下面描述...
但首先,您需要确保在全局页面中有一个命名的处理程序函数来处理所有消息,如下所示:
function handleMessage(evt) {
switch (evt.name) {
case 'Message1':
// do something with evt.message
break;
case 'Message2':
// do something else with evt.message
break;
}
}
safari.application.addEventListener('message', handleMessage, false);
如果您对每条不同的消息都有单独的处理程序,或者您使用的是匿名函数,那么这种方法将不起作用。
现在,弹出框和内容脚本中的包装函数非常简单:
function tellGlobalPage(msgName, msgData) {
if (safari.self instanceof SafariExtensionPopover) {
// this script is running in a popover
var fakeMsgEvt = { name: msgName, message: msgData };
safari.extension.globalPage.contentWindow.handleMessage(fakeMsgEvt);
} else {
// this script is a content script
safari.self.tab.dispatchMessage(msgName, msgData);
}
}
然后代替safari.self.tab.dispatchMessage(name, data),
你使用tellGlobalPage(name, data).
请注意,这种简单的方法不处理往返消息,其中弹出框或内容脚本将消息发送到全局页面,全局页面回复另一条消息。还有其他方法可以解决这个问题。