2

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

我使用了 serg对Chrome 的 tabs.executeScript 的回答——传递参数和使用库?作为弹出窗口->页面交互的灵感。

问题是以下点击处理程序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(),而不是在脚本完成执行时执行。所以这种情况可以忽略。我已经改写了问题标题以反映这一点。

我正在寻找的是为什么第二种情况的回调根本不执行。

4

1 回答 1

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位置。

于 2012-11-01T16:01:16.423 回答