【问题标题】:Validate context menu item for each tab验证每个选项卡的上下文菜单项
【发布时间】:2012-02-19 00:44:41
【问题描述】:

我正在开发一个简单的 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);

这一切都很好,除了验证只执行一次,而且只有在我的扩展加载时标签/页面位于最前面。如果该页面对上下文菜单有效,那么所有其他页面也是如此,反之亦然。我希望为每个 Safari 选项卡单独执行验证。

这可以完成吗?我是否在注入脚本或发送消息的工作方式上遗漏了什么?

【问题讨论】:

    标签: javascript macos safari safari-extension


    【解决方案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;
      };
    };
    

    【讨论】:

    • 谢谢,这正是我所追求的! global.html 是一个单例,每个选项卡的唯一实例会以多种方式限制扩展的可能性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    相关资源
    最近更新 更多