1

当用户单击图标时,我试图显示一个弹出窗口。仅当 url 不包含“chrome://”或“about:”时才会显示弹出窗口。效果很好。但是在普通页面上,仅当我第二次单击该图标时才会出现弹出窗口。第一次点击没有任何反应。这是来自 background.html 的代码

// Called when the user clicks on the browser action.
chrome.browserAction.onClicked.addListener(function(tab) {
    if (!tab.url.indexOf('chrome://') ||!tab.url.indexOf('about:')) {
        alert('For security reasons, this page cannot shared.');
        return;
    }
    else {
        chrome.browserAction.setPopup({tabId:tab.id,popup:"html/popup.html"});
    }
});

我究竟做错了什么?

4

2 回答 2

3

正确复制您的问题后,我发现发生了什么:第一次单击时没有显示弹出窗口的原因是因为它没有显示。

想想看。单击浏览器图标,您正在设置弹出窗口。应该显示什么?它不知道,但是事件已经被触发了,所以默认机制不知道要显示什么。在你的事件处理程序中,它只是一个没有内置在浏览器中的 javascript 机制,然后你设置它,但已经太晚了。但是,第二次(以及第三次、第四次等等)实际上会显示一个弹出窗口,因为现在它知道要显示哪个弹出窗口。

解决方案?显而易见的是将弹出窗口作为 manifest.json 的一部分,就像其他人一样:

"browser_action": {
  "default_icon": "icons/icon19.png",
  "default_title": "browser action demo",
  "default_popup": "src/browser_action/browser_action.html"
},

当然这样做意味着chrome.browserAction.onClicked不会被解雇,但公平地说,你应该给用户一个登陆弹出窗口。如果您想在之后出现弹出窗口,请提供一个执行此操作的界面(单击时会向 backgroundPage 发送消息以更改弹出窗口的按钮)。

其他选项可能是beforeShow弹出处理程序,但我不会放弃希望,因为我在 API 中没有找到类似的东西。

于 2013-01-04T00:40:13.263 回答
0

您似乎正在将两个互斥事件混合到一个功能中。

chrome.browserAction.onClicked将在没有使用弹出窗口时使用。

以下脚本仅使用您的 background.html 执行一次

chrome.browserAction.onClicked.addListener(function (tab) {
    console.log("Is fired..");
    chrome.browserAction.setPopup({
        popup: "popup.html"
    });

});

如果您想更改某些任意逻辑的弹出页面(例如某些 url 或内容),请将其放在每个选项卡 ID 的背景页面中。顺便说一句,您正在寻找什么业务逻辑?

于 2013-01-04T12:11:40.007 回答