在我的Chrome扩展程序中运行chrome.tabs.executeScript()的意外结果?

时间:2014-09-15 01:54:36

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

通过运行以下脚本(在我的Chrome扩展程序中),我得到了一些意想不到的结果:

        chrome.windows.getAll({populate: true}, function(wnds)
        {
            for(var w = 0; w < wnds.length; w++)
            {
                var tabs = wnds[w].tabs;

                for(var t = 0; t < tabs.length; t++)
                {
                    var tab = tabs[t];
                    var tabUrl = tab.url;

                    try
                    {
                        chrome.tabs.executeScript(tab.id, {
                            file: "content.js",
                            allFrames: true,
                            matchAboutBlank: true
                        }, function(arrRes)
                        {
                            if(chrome.runtime.lastError)
                            {
                                console.error("INJ ERR: " + chrome.runtime.lastError.message);
                            }
                            else
                            {
                                console.log("INJ OK: " + tabUrl);
                            }
                        });
                    }
                    catch(e)
                    {
                    }
                }
            }
        });

当脚本单独运行时,我在控制台日志屏幕中得到以下内容:

enter image description here

但是当我使用调试器逐步执行它时,它会输出类似这样的内容(或每页的正确信息):

enter image description here

我显然期待第二个结果。那么我做错了什么?

1 个答案:

答案 0 :(得分:1)

您需要为executeScript的每次调用创建一个闭包,这样每次调用回调函数时都会获得正确的tabUrl值。您的代码现在的方式,所有调用将使用tabUrl的最后一个值。解决这个问题的一种方法是:

    chrome.windows.getAll({populate: true}, function(wnds)
    {
        for(var w = 0; w < wnds.length; w++)
        {
            var tabs = wnds[w].tabs;

            for(var t = 0; t < tabs.length; t++)
            (function()
            {
                var tab = tabs[t];
                var tabUrl = tab.url;

                try
                {
                    chrome.tabs.executeScript(tab.id, {
                        file: "content.js"
                    }, function(arrRes)
                    {
                        if(chrome.runtime.lastError)
                        {
                            console.error("INJ ERR: " + chrome.runtime.lastError.message);
                        }
                        else
                        {
                            console.log("INJ OK: " + tabUrl);
                        }
                    });
                }
                catch(e)
                {
                }
            })();
        }
    });