【问题标题】:Google Chrome Extensions: create a window only once谷歌浏览器扩展:只创建一次窗口
【发布时间】:2015-08-29 16:25:16
【问题描述】:

我通过点击搜索栏附近的扩展按钮打开了一个新窗口。 我只想打开一个尚未打开的新窗口;在这种情况下,我宁愿展示旧的。

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

  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 值都在关闭应用程序后被删除(在它完成执行脚本后),但我该如何修复它?如果可能,不使用 localStorage 或 cookie。

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

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension google-chrome-devtools


    【解决方案1】:
    1. 将window 更改为另一个变量名。
    2. 变量名要一致。 window_list 和 list 是不同的东西。
    3. 使用chrome.windows.update 而不是window.focus(),因为后者不起作用。
    4. 使用chrome.windows.get 来查看窗口是否存在,而不是维护一个窗口列表。
    5. 在chrome.windows.create的回调中可以看到新窗口的详细信息。正确使用此方法:

    代码:

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

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

    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( in ) 使用简单的 for 循环。有时将索引号作为 id。 for(j=0; j
    【解决方案2】:
    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;
                }
            );
        }
    });
    

    这是一个适合我的替代代码

    【讨论】:

    • 你能提供一个更好的解释这个修复吗?
    • 最好解释一下您的代码,它与问题中的“错误”代码有何不同。仅仅几个 cmets 可能是不够的。特别是因为已经有一个非常相似的公认答案 - 你的答案有什么不同,为什么/什么时候更好?但是,我不同意反对票 - 这不是没用的。
    • 其实,我可能会重新考虑。除非设置了特定的实验标志,否则我认为以这种方式打开的窗口不会保留类型 "panel"。
    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 2015-04-17
    • 2014-07-24
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多