为什么我在Chrome浏览器中点击页面动作按钮时,onClick事件不会触发?

7
我有一个微不足道的谷歌浏览器扩展,旨在在特定域名上显示一个页面操作

Manifest.json:

{
  "name" : "Page action by content",
  "version" : "1.1",
  "description" : "Shows a page action for HTML pages containing a video",
  "background" : {
    "scripts": ["background.js"],
    "persistent": false
  },
  "page_action" :
  {
    "default_icon" : "video-19.png",
    "default_title" : "There's a <video> in this page!"
  },
  "permissions": [ "declarativeContent" ],
  "icons" : {
    "48" : "video-48.png",
    "128" : "video-128.png"
  },
  "manifest_version": 2
}

background.js:

chrome.runtime.onInstalled.addListener(function () {
  chrome.declarativeContent.onPageChanged.removeRules(undefined, function () {
      chrome.declarativeContent.onPageChanged.addRules([
          {
              conditions: [
                  new chrome.declarativeContent.PageStateMatcher({
                      pageUrl: { hostSuffix: 'stackoverflow.com' },
                  })
              ],
              // And shows the extension's page action.
              actions: [new chrome.declarativeContent.ShowPageAction()]
          }
      ]);
  });
});

chrome.pageAction.onClicked.addListener(function (tab) {
  alert('hello!');
});

在大多数计算机上,这个程序可以正常运行。但是,在极少数情况下,用户看到的不是预期的alert(),而是扩展程序的右键菜单(如果该操作被禁用或右键单击,则通常会显示此菜单)。图标亮起来,就好像已启用,但是onClicked监听器未执行。
更奇怪的是,当扩展程序最初安装时,即使在少数计算机上,它也可以按预期工作。只有在重新启动Chrome后,错误的行为才会出现。无论扩展程序是从Chrome商店加载还是未打包加载,都会发生这种情况。
它也可以通过其他扩展程序(特别是使用百度网站的演示站点page-action-demo)进行复制。 browserAction则不受影响。
manifest.json中存在错误,还是我需要提交一个错误报告?

1
据我所知,pageAction.onClicked()会在单击页面操作图标时触发。如果页面操作有一个弹出窗口,则此事件将不会触发。您可以从SO帖子中查看弹出窗口问题的解决方案。 - Jessica Rodriguez
@jess,同意,但在这种情况下,当单击pageAction的图标时,事件不会触发。测试代码的清单和背景脚本与测试时列出的完全相同-这里没有弹出窗口。 - Mitch
@Mitch 你找到解决方案了吗?我也注意到了同样的问题。 - Rob Hawkins
@RobHawkins,我没有。在最新的Chrome(2019年10月)中仍然可以重现。 - Mitch
好的,没问题。我改用浏览器操作了。对我来说,当我从使用“tabs”权限切换到“activeTab”时,问题就出现了。 - Rob Hawkins
我认为我在macOS/Chrome上遇到了相同的问题。 - themefield
1个回答

2

chrome.pageAction.onClicked.addListener所说:

如果页面操作具有弹出窗口,则此事件不会触发

这意味着您的manifest.json文件应该包含类似以下内容(您已经有了):

"page_action": {
     "default_title": "Google Mail",      // optional;
     "default_icon": "images/icon32.png"  // optional;
} 

"default_popup": "popup.html" <---------------- 应该被移除
下一步是在特定标签页中显示“页面操作”。我不知道为什么,但由于某些原因它是可见和活动的,当你点击它时,它会显示上下文弹出菜单。
chrome.pageAction.show(integer tabId, function callback)

在您的后台脚本中完成此操作 ⏫
 `chrome.pageAction.onClicked` 

应该触发事件。希望这可以帮到你。

这是针对问题的答案还是页面操作要求的审查?相对于你的答案,我没有发现自己做错了什么。 - Mitch
图标会亮起来,就好像它已经启用了一样,但是 onClicked 监听器没有被执行。正如你之前所说,监听器没有被执行。你问为什么?我告诉你,因为你没有使用 chrome.pageAction.show(integer tabId, function callback),其他的都只是为了防止其他人遇到类似的问题。 - Oleksii Semeniuk
我仍然不理解。扩展程序按预期被激活和停用,只是没有调用 onClicked。扩展程序中没有列出弹出窗口。您是否在暗示 chrome.declarativeContent.ShowPageAction 不合适? - Mitch
6
类似这样的代码: chrome.tabs.onActivated.addListener(function (tabs) { chrome.pageAction.show(tabs.tabId); }); 意思是在Chrome浏览器中,当用户切换到一个新的标签页时,会展示该标签页对应的页面操作(pageAction)。 - Oleksii Semeniuk
1
考虑将实际解决方案添加到答案本身中?! :D - Martin Schneider
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接