Chrome扩展程序弹出按条件显示

ill*_*zor 4 javascript popup google-chrome-extension

我想通过点击显示弹出窗口,但仅当条件为假时才显示.点击扩展图标后,使用当前名称搜索选项卡.如果找到选项卡,则后台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
 }
}
Run Code Online (Sandbox Code Playgroud)

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

Xan*_*Xan 6

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

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

如果未设置弹出页面,则会执行事件侦听器,但无法以编程方式显示弹出窗口.您可以做的最多是为下一次单击设置弹出窗口.

那么,该怎么办呢?

1)你可以做一个在Edwin的回答中描述的丑陋的黑客(某种).始终显示弹出窗口,尽快检查条件,向后台发送消息并在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
});
Run Code Online (Sandbox Code Playgroud)

3)这种花哨的方法是使用实​​验性的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'});  
    }
  });
});
Run Code Online (Sandbox Code Playgroud)