【问题标题】:Chrome extension browser action acts weird when switching tabs切换标签时,Chrome 扩展浏览器操作行为怪异
【发布时间】:2016-05-18 11:43:42
【问题描述】:

我有一个 chrome 扩展程序,当我在一个选项卡中使用它时,它可以完美运行。然后我转到另一个选项卡,扩展程序仍然有效,但这是我无法理解的奇怪事情。当我回到第一个选项卡并单击浏览器操作以显示扩展名或关闭(如果我将其保持打开状态)时,什么也没有发生。我需要第二次点击浏览器操作,然后扩展开始工作。

定义浏览器操作按钮的部分 background.js:

chrome.browserAction.onClicked.addListener(function (tab) {       
    if (page_loaded == true) {
        chrome.tabs.query({ active: true, currentWindow: true, highlighted: true }, function (tabs) {
            chrome.tabs.sendMessage(tabs[0].id, { greeting: "browser_action_clicked" }, function (response) {
                if (response.found == 'N') {
                    chrome.tabs.executeScript(null, { file: "src/injection.js" }, function () {
                        chrome.tabs.executeScript(null, { file: "src/extension.js" }, function () {
                            chrome.tabs.executeScript(tab.id, { code: "$('.cheap-watcher' ).animate({ 'right': '0px' }, 'slow');" }, function () {
                                sidebarActive = true;
                            });
                        });
                    });
                }
                else {
                    if (sidebarActive == true) {
                        chrome.tabs.executeScript(tab.id, { code: "$('.cheap-watcher' ).animate({ 'right': '-370px' }, 'slow');" }, function () {
                            sidebarActive = false;
                        });
                    }
                    else {
                        chrome.tabs.executeScript(tab.id, { code: "$('.cheap-watcher' ).animate({ 'right': '0px' }, 'slow');" }, function () {
                            sidebarActive = true;
                        });
                    }
                }
            });
        });
    }      
});

我写错了吗?还是chrome bug?

【问题讨论】:

  • “这里不需要的其他功能” 或者你认为。
  • 旁注:您不必查询活动选项卡,您已经从 onClicked 事件中获得了它。
  • 您的page_loaded 有何变化?还有 - 你试过debugging这个吗?
  • 无论如何,我可以猜到足以回答这个问题..
  • 我的 page_loaded 更改在 chrome.tabs.onUpdated.addListener 函数中完成后它是真的加载它是假的。我还没有调试它。它想听听你的猜测。附注:删除 active: true 扩展后抛出错误,我的响应未定义。 @Xan

标签: google-chrome google-chrome-extension


【解决方案1】:

您的sidebarActive 存储为全局状态变量(与page_loaded 相同)。因此,以下是您的示例:

  1. 您单击第一个选项卡上的按钮;显示侧边栏,sidebarActive 设置为 true。
  2. 您对第二个选项卡执行某些操作,最终导致 sidebarActive 为假 - 不再反映旧选项卡的状态。
  3. 您单击第一个选项卡上的按钮;由于sidebarActive 为假,您尝试显示侧边栏;但是,它已经显示出来了,所以给人一种“什么都不做”的印象。
  4. 但是,现在sidebarActive 实际上与标签页同步,因此后续点击“工作”。

这根本行不通,因为状态实际上是每个标签的。您必须:

  • 将状态保存在内容脚本中,而不是后台脚本中,或者
  • 保存每个选项卡的状态,例如作为由选项卡 ID 索引的数组:sidebarActive[tab.id]
    在这种情况下,当标签更新发生时,您可能仍需要对数组进行一些清理。

【讨论】:

  • P.S.跳到“它是 Chrome 错误”是一个非常大胆的结论。除非您完全消除了这种可能性,否则请始终认为自己有过错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
相关资源
最近更新 更多