【问题标题】:Chrome extension popup showing by condition按条件显示的 Chrome 扩展弹出窗口
【发布时间】:2014-12-20 06:34:17
【问题描述】:

我想通过点击显示弹出窗口,但前提是条件为假。 单击以扩展图标背景 js 搜索具有当前名称的选项卡后。如果选项卡找到后台 js 继续工作。如果找不到 - 我想显示带有说明的弹出窗口。无法理解在这种情况下如何只显示弹出窗口。 我可以通过 browserAction.setPopup() 设置弹出窗口,但只有在下次点击后才会显示弹出窗口。 我只想显示我的弹出窗口一次。 这绝对是可能的,我在其他扩展程序上看到过这种行为。

var pcTabs; // tabs array

chrome.browserAction.onClicked.addListener(buttonClick);

function buttonClick() {
 // getting tabs...
 if(pcTabs.length != 0){
    // working with finded tabs
 } else{ // tabs not found
    // show popup.html here. this is the question
 }
}

更新。 这是我的background.js。所有代码也在存储库中。 如何将警报替换为弹出窗口?

【问题讨论】:

  • 你能编辑你的问题吗?缺少的逗号把我弄乱了(不是想成为一个 di * k。和“我想通过点击显示弹出窗口”点击当前页面或浏览器行动
  • 这个js文件在后台文件还是弹窗里呢?而且你不需要把!= 01 because in javascript 1 == true`和0 == false
  • 在后台。感谢您对真/假的解释
  • 好的,所以你想要的是:当你点击 browserAction 时,你想找到某些选项卡,如果你发现它们不显示弹出窗口,如果你这样做然后显示它?
  • 是的。例如this 扩展名。如果未打开谷歌音乐页面,则显示带有链接的弹出窗口。如果打开 - 只是暂停\播放音乐。我想实现完全相同的行为

标签: javascript google-chrome-extension popup


【解决方案1】:

简而言之:你不能按照你描述的方式去做。

设置弹出页面时,chrome.browserAction.onClicked 不会触发,并且会显示弹出窗口。

当没有设置弹出页面时,你的事件监听器会执行,但是你cannot show a popup programmatically。您最多可以设置一个弹出窗口以供下次点击。

那么,该怎么处理呢?

1)你可以做一个丑陋的黑客(有点)在埃德温的回答中描述。始终显示弹窗,尽快检查条件,向后台发送消息,如果条件满足则执行window.close()

当然,它很丑。

2) 执行此操作的正确方法是在条件可能发生变化时更新弹出窗口。也就是说,每当您从pcTabs 添加/删除数据时,您应该使用chrome.browserAction.setPopup 设置/取消设置弹出窗口

// ... somewhere ...
pcTabs.push(/*...*/);
chrome.browserAction.setPopup({popup: ''});

// ... somewhere else ...
pcTabs.pop(/*...*/);
if(!pcTabs.length) chrome.browserAction.setPopup({popup: 'popup.html'});    

chrome.browserAction.onClicked.addListener(function() {
  // Assume condition is met, popup didn't show
});

3) fancy 的方法是使用实​​验性 JavaScript 方法 Array.observe,该方法仅在 Chrome 中支持。

var pcTabs = [];
Array.observe(pcTabs, function(changes) {
  changes.forEach(function(change) {
    if(change.object.length) {
      chrome.browserAction.setPopup({popup: ''});
    }   else {
      chrome.browserAction.setPopup({popup: 'popup.html'});  
    }
  });
});

【讨论】:

  • 感谢您提供信息。第二种方式看起来不错。我可以将侦听器设置为 chrome.tabs(打开/关闭/更新)。但这会是个好主意吗?所有选项卡都将被检查多次,大多数情况下是绝对没有必要的。我想没关系,如果我留下警报。如果有人使用此扩展程序,他知道他为什么这样做,并且不会在没有需要的情况下单击按钮。
  • 您也可以使用chrome.notifications 以比警报更不突兀的方式,或者使用第二种/第三种方法来启用/禁用按钮而不是设置弹出窗口。
  • 有一个 API 可以以编程方式显示弹出窗口,但它被列入白名单 :( code.google.com/p/chromium/issues/detail?id=305744
【解决方案2】:

好的,这是我的代码:

chrome.tabs.query({currentWindow: true, active: true}, function(tabs) {
    if (!tabs[0].url.includes('google.com')) { //check if current tab is not google: if false show popup, you can just put an else at the end and do w.e with your popup
        chrome.tabs.query({currentWindow: true, url: 'https://*.google.com/*'}, function(tabs) { //since current tab is not google query tabs with google
            if (tabs.length) { //check if there are any pages with google
                chrome.tabs.highlight({tabs: tabs[0].index}, function(w) {}); //this is what I chose to do idk what you want to do but you can write w.e here
            } else { 
                chrome.tabs.create({url: 'https://google.com'}); //other wise no pages with google open one
            }
        });
    };
});

【讨论】:

  • 这是对这个问题的回答如何?
  • 不是他想要做的,而是不同的功能意味着不是打开一个新页面,而是他可以在那里写的其他东西,比如不改变当前标签(突出显示)而是别的东西我不确定他想做什么
  • 原则上,如果您不确定,最好先问清楚再回答。问题标题很清楚:如何根据条件打开(浏览器操作)弹出窗口。
  • 这就是条件if(!tabs[0].url.includes('google.com')
  • show a popup怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多