我最近将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
}
});
});
答案 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
}
});
});
extension.sendRequest()
和extension.onRequest
已被弃用。您应该使用runtime.sendmessage()
和runtime.onMessage
替换它们。