Javascript 谷歌浏览器扩展:只创建一次窗口

Javascript 谷歌浏览器扩展:只创建一次窗口,javascript,google-chrome,google-chrome-extension,google-chrome-devtools,Javascript,Google Chrome,Google Chrome Extension,Google Chrome Devtools,我通过点击搜索栏附近的扩展按钮打开一个新窗口。 我只想打开一个尚未打开的新窗口;那样的话,我宁愿展示旧的 这是我的代码,但它不起作用 var v = null; var vid = null; chrome.browserAction.onClicked.addListener(function(tab) { chrome.windows.getAll({}, function(list) { // check if already exists fo

我通过点击搜索栏附近的扩展按钮打开一个新窗口。 我只想打开一个尚未打开的新窗口;那样的话,我宁愿展示旧的

这是我的代码,但它不起作用

  var v = null;
  var vid = null;
  chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.windows.getAll({}, function(list) {
      // check if already exists
      for(window in window_list)
        if(window.id == vid) { window.focus(); return; }

      chrome.windows.getCurrent(function(w) {
        v = chrome.windows.create({'url': 'my_url', 'type': 'panel', 'focused': true});
        vid = w.id;
      });
    });
  });
有人能告诉我怎么修吗

最有可能的是,在关闭应用程序(在它完成执行脚本之后)后,
v
vid
值都会被删除,但是我如何修复它呢?如果可能,不使用本地存储或cookie

我尝试在创建窗口时指定
tabId
属性,但它不起作用。 我也尝试过使用chrome.windows.onRemoved.addListener的

  • 窗口
    更改为另一个变量名
  • 变量名要一致<代码>窗口列表
  • 列表
    是不同的东西
  • 使用而不是
    window.focus()
    ,因为后者不起作用
  • 用于查看窗口是否存在,而不是维护窗口列表
  • 新窗口的详细信息可在的回调中找到。以正确的方式使用此方法:
  • 代码:

    或者,不检查窗口是否存在,只需更新窗口,当出现错误时,打开一个新窗口:

    chrome.windows.update(vid, {focused: true}, function() {
        if (chrome.runtime.lastError) {
            chrome.windows.create(
                {'url': 'my_url', 'type': 'panel', 'focused': true},
                function(chromeWindow) {
                    vid = chromeWindow.id;
                });
        }
    });
    

    这是一个对我有用的替代代码

    @auino您的整个代码都被破坏了,我更新了我的答案,并扩展了“//代码的其余部分”嘿。我有一只虫子在里面。使用简单for循环代替for(in)。它有时以索引号作为id。对于(j=0;jc)您能更好地解释这个修复吗?最好解释一下您的代码,它与“错误”有什么不同问题中的代码。仅仅几个注释可能是不够的。特别是因为已经有了一个非常相似的公认答案-你的答案有什么不同,为什么/什么时候更好?但是,我不同意否决票-这并不是没有用的。实际上,我可能会重新考虑。除非设置了一个特定的实验标志,否则我认为windows不会打开这样可以保留类型
    “面板”
    chrome.windows.update(vid, {focused: true}, function() {
        if (chrome.runtime.lastError) {
            chrome.windows.create(
                {'url': 'my_url', 'type': 'panel', 'focused': true},
                function(chromeWindow) {
                    vid = chromeWindow.id;
                });
        }
    });
    
    chrome.windows.getAll({}, function(window_list) {
        var extWindow = '';
        window_list.forEach(function(chromeWindow) {
            //Check windows by type
            if (chromeWindow.type == 'panel') {
                extWindow = chromeWindow.id;
                //Update opened window
                chrome.windows.update(extWindow, {focused: true});
                return;
            }
        });
    
        if (extWindow == '') {
            //Open window
            chrome.windows.create(
                {
                    'url'       : 'my_url',
                    'type'      : 'panel',
                    'focused'   : true
                },
                function(chromeWindow) {
                    extWindow = chromeWindow.id;
                }
            );
        }
    });