我正在开发一个简单的Safari扩展,它添加了一个上下文菜单项,单击该项后,我可以使用当前页面上的数据执行特定任务。在我的injected-scripts.js
我有一个函数validForContextMenu
,它确定是否应该为点击的标签显示上下文菜单。除了这个函数,我还将以下消息发送到global.html
,以便让它知道选项卡是否应该显示我的上下文菜单项。
safari.self.tab.dispatchMessage("validate", validForContextMenu());
在global.html
我正在执行以下操作来收听消息,存储injected-scripts.js
返回的数据,并执行实际验证:
var contextMenuDisabled = true;
function respondToMessage(theMessageEvent) {
if (theMessageEvent.name === "validate") {
contextMenuDisabled = theMessageEvent.message;
}
}
safari.application.activeBrowserWindow.activeTab.addEventListener("message", respondToMessage, false);
function validateCommand(event) {
event.target.disabled = contextMenuDisabled;
}
safari.application.addEventListener("validate", validateCommand, false);
除了验证只执行一次,并且仅在我的扩展加载时标签/页面位于最前面的事实之外,这一切都很好。如果该页面对上下文菜单有效,那么所有其他页面也是如此,反之亦然。我希望每个Safaris选项卡都能单独执行验证。
这可以吗?在注入脚本或调度消息的方式上,我是否遗漏了某些内容?
答案 0 :(得分:1)
global.html
是单身,因此您的所有标签只有一个变量contextMenuDisabled
。 Safari为此任务提供了特殊的API - safari.self.tab.setContextMenuEventUserInfo。
我使用扩展程序中的下一个代码。在inject.js中:
document.addEventListener('contextmenu', onContextMenu, false);
function onContextMenu(ev) {
var UserInfo = {
pageId: pageId
};
var sel = document.getSelection();
if (sel && !sel.isCollapsed)
UserInfo.isSel = true;
safari.self.tab.setContextMenuEventUserInfo(ev, UserInfo);
};
在global.js中:
safari.application.addEventListener('validate', onValidate, false);
function onValidate(ev) {
switch (ev.command) {
case 'DownloadSel':
if (!ev.userInfo || !ev.userInfo.isSel)
ev.target.disabled = true;
break;
};
};