一個簡單的方法來實現重用你的基於消息的內容腳本代碼在你的酥料餅是包裝在下面我將描述一個抽象函數的調用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).
請注意,這個簡單的方法不處理帶有往返消息傳遞,其中彈出窗口或內容腳本將消息發送到全局頁面,並且全局頁面使用另一條消息進行回覆。還有其他方法可以解決這個問題。
你是對的,你只需要忍受一個事實,即瀏覽器體系結構的某些方面是不同的,即使只是輕微的。 – 2013-05-14 16:26:12