在tabs.executeScript回调中使用时,不执行browserAction.setBadgeText

时间:2012-11-01 12:59:48

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

我正在处理我的第一个Chrome扩展程序。我有一个加载popup.html的默认弹出窗口popup.js

我使用serg的answerChrome's tabs.executeScript - passing parameters and using libraries?作为popup->页面互动的灵感来源。

问题是popup.js中的以下点击处理程序有效:

function click(e) {
    chrome.browserAction.setBadgeText ( { text: "loading" } );
    chrome.tabs.executeScript(null,
        {code:"globalVarName = {'scriptOptions': {...}};" },
        chrome.tabs.executeScript(null, {file: "js/script.js"},
            chrome.browserAction.setBadgeText ( { text: "done" } ))
    );
    window.close();
}

但以下情况并非如此:

function click(e) {
    chrome.browserAction.setBadgeText ( { text: "loading" } );
    chrome.tabs.executeScript(null,
        {code:"globalVarName = {'scriptOptions': {...}};" },
        chrome.tabs.executeScript(null, {file: "js/script.js"},
            function(){chrome.browserAction.setBadgeText ( { text: "done" } );})
    );
    window.close();
}

我希望在完成时可以做多件事。

编辑:

我意识到第一种情况会立即执行chrome.browserAction.setBadgeText(),而不是在脚本执行完毕后。所以这种情况可以忽略不计。我已经改写了问题标题以反映这一点。

我正在寻找的是为什么第二个案例的回调根本不执行。

1 个答案:

答案 0 :(得分:3)

我很确定这里的罪魁祸首是window.close()关闭弹出窗口。执行此代码的相同弹出窗口(除了script.js,在实际页面上执行)。

因此,回调从未被执行过。我当然只谈论案例2(参见我对问题的编辑)。

我为未来访客提供的最新完整代码:

var tabId = null;
function click(e) {
    chrome.browserAction.setBadgeText ( { text: "..." } );
    chrome.tabs.executeScript(tabId, 
        {code:"globalVarName= {...}" }, 
        function(){ 
            chrome.tabs.executeScript(tabId, {file: "js/script.js"},
                function(){chrome.browserAction.setBadgeText ( { text: "done" } );
                    setTimeout(function() { 
                        chrome.browserAction.setBadgeText ( { text: "" } ); 
                    }, 1000);
                }
            ); 
        } 
    );
}

另请注意,脚本的路径(此处为script.js)是相对于扩展源根目录,即manifest.json所在的位置。