首次单击时弹出窗口不会显示

时间:2013-01-02 08:57:37

标签: google-chrome-extension

我正在尝试在用户点击图标时显示弹出窗口。只有当网址不包含“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"});
    }
});

我做错了什么?

2 个答案:

答案 0 :(得分:3)

在正确复制问题之后,我发现了正在发生的事情:第一次点击中没有显示弹出窗口的原因是因为它没有要显示的内容。

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

解决方案?显而易见的是将popup作为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中没有找到类似的东西。

答案 1 :(得分:0)

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

当没有使用弹出窗口时,将使用

chrome.browserAction.onClicked

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

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

});

如果要在某些任意逻辑(例如某些网址或内容)上更改弹出页面,请将其放在每个标签ID的后台页面中。 BTW您正在寻找什么样的业务逻辑?