无法访问Chrome版本55中chrome.tabs.executescript中的全局变量

时间:2016-12-09 05:56:11

标签: google-chrome google-chrome-extension

我最近将Chrome更新为版本55.0.2883.75。 我使用自行开发的Chrome插件来解析我的HTML文件,其中我使用chrome.tabs.executescript从后台HTML页面获取数据。 因此,当我执行chrome.extension.onRequest时,我将后台页面的已解析数据保存到全局变量,并在chrome.tabs.executescript的回调函数中访问它并进行处理。

在我更新到版本55.0.2883.75之前,此工作正常。 如何在新版本中访问全局变量??

我的代码如下:

第1步:

chrome.extension.onRequest.addListener(
    function (request, sender, sendResponse) {
        parser = new DOMParser();
        htmlDoc = parser.parseFromString(request.content, "text/html");

        //outputJson is a global variable which is Populated here
        outputJson = parseMyPage(outputJson, htmlDoc);


    });

第2步:

chrome.tabs.getSelected(null, function (tab) {
    // Now inject a script onto the page
    chrome.tabs.executeScript(tab.id,{
        code: "chrome.extension.sendRequest({content: document.body.innerHTML}, function(response) { console.log('success'); });"
    }, function () {

       //my code to access global variables
if (outputJson && null != outputJson) {
    // other stuff
}

    });
}); 

1 个答案:

答案 0 :(得分:1)

代码的设计方式,您依赖于执行两个异步代码块的顺序:extension.onRequest 1 事件和tabs.executeScript()的回调。您的代码要求在extension.onRequest回调执行之前触发tabs.executeScript() 1 事件。无法保证这将是这些发生的顺序。如果这是一个已发布的扩展,很可能这在用户的计算机上失败,具体取决于它们的配置。在Chrome 55之前,Chrome中的代码也可能导致事件和回调始终按照您所需的顺序发生。

解决方案是将其重写为不需要任何特定顺序来执行这些异步代码块。幸运的是,有一种方法可以做到这一点并同时降低复杂性。

您可以将内容脚本所需的信息直接传输到后台脚本中,直接转移到tabs.executeScript()的回调中,而无需显式传递消息。执行脚本的值传递给数组中的回调,该数组包含注入脚本的每帧一个条目。这可以非常方便地用于将数据从内容脚本传递到tabs.executeScript()回调。显然,你只能以这种方式每帧发回一个值。

以下代码应该按照您的意愿行事。我从本问题的代码和我的answer here手动编辑了此代码。虽然该答案中的代码已经过全面测试,但我在此答案中编辑此内容的事实意味着可能会出现一些错误:

chrome.tabs.getSelected(null, function (tab) {
    // Now inject a script onto the page
    chrome.tabs.executeScript(tab.id,{
        code: "document.body.innerHTML;"
    }, function (results) {
        parser = new DOMParser();
        htmlDoc = parser.parseFromString(results[0], "text/html");
        //outputJson is a global variable which is Populated here
        outputJson = parseMyPage(outputJson, htmlDoc);
        //my code to access global variables
        if (outputJson && null != outputJson) {
            // other stuff
        }
    });
}); 
    自Chrome 33以来,
  1. extension.sendRequest()extension.onRequest已被弃用。您应该使用runtime.sendmessage()runtime.onMessage替换它们。