Google chrome extension Chrome扩展图标更改问题

Google chrome extension Chrome扩展图标更改问题,google-chrome-extension,popup,icons,Google Chrome Extension,Popup,Icons,我正在开发一个Chrome扩展,在动态更改图标时遇到了一个奇怪的问题 在我的popup.html中,我有一个按钮,通过单击该按钮,我想在浏览器中更改扩展的图标。例如,从彩色到黑白(当应用程序处于非活动状态时) 因此,负责这项工作的职能是: function toggleActivated(){ localStorage.isActive = toBool(localStorage.isActive) ? false : true; $('#activate

我正在开发一个Chrome扩展,在动态更改图标时遇到了一个奇怪的问题

在我的popup.html中,我有一个按钮,通过单击该按钮,我想在浏览器中更改扩展的图标。例如,从彩色到黑白(当应用程序处于非活动状态时)

因此,负责这项工作的职能是:

    function toggleActivated(){
        localStorage.isActive = toBool(localStorage.isActive) ? false : true;
        $('#activate-disactivate span').text(toBool(localStorage.isActive) == false ? 'Включить' : 'Выключить');
        chrome.browserAction.setIcon({path: toBool(localStorage.isActive) ? '48.png' : '48_bw.png'});
        //window.close();
     }
但问题是,我想在图标更改后关闭弹出窗口。如果我在结尾使用
window.close()
,则图标不会更改,但如果它被注释掉,则图标会很好地更改


为什么
chrome.browserAction.setIcon()
window.close()
之间存在冲突?

听起来像
chrome.browserAction.setIcon
是异步启动的,但弹出窗口在完成之前就关闭了。您可以尝试在关闭前添加500毫秒
设置超时


您还应该在提交错误报告。

这听起来像是
chrome.browserAction.setIcon
被异步触发,但弹出窗口在完成之前关闭。您可以尝试在关闭前添加500毫秒
设置超时


您还应该在提交错误报告。

我知道这是一个老问题,但我也遇到了同样的问题,他说的
chrome.browserAction.setIcon
被异步调用是正确的。但我不认为设置超时是最好的答案

如果检查,您可以看到此方法将函数回调作为参数。您应该在这里调用
window.close()
。像这样:

chrome.browserAction.setIcon({ path: icon_path }, function() {
    window.close();
});
更新:
正如下面的评论所指出的,您可以向函数传递一个tabId参数来限制更改的范围。

我知道这是一个老问题,但我也遇到了同样的问题,他说的
chrome.browserAction.setIcon
被异步调用是正确的。但我不认为设置超时是最好的答案

如果检查,您可以看到此方法将函数回调作为参数。您应该在这里调用
window.close()
。像这样:

chrome.browserAction.setIcon({ path: icon_path }, function() {
    window.close();
});
更新:
正如下面的注释所指出的,您可以向函数传递一个tabId参数来限制更改的范围。

是的,就是这样,我添加了setTimeout(function(){window.close();},100);是的,就是这样,我添加了setTimeout(function(){window.close();},100);但这是在所有选项卡中更改图标,我只想在发生事件的选项卡上更改。使用tabid chrome.browserAction.setIcon({path:icon_path,tabid:tab_id},function(){window.close();})完成此操作;很酷,很高兴你能修好它。我将更新我的答案以提及tabid参数。但这是在所有选项卡中更改图标,我只想更改发生事件的选项卡上的图标。使用tabid chrome.browserAction.setIcon({path:icon_path,tabid:tab_id},function(){window.close();})完成此操作;很酷,很高兴你能修好它。我将更新我的答案,以提及tabid参数。