我的background.js中有以下代码:
chrome.webRequest.onHeadersReceived.addListener(function(details){
if(isfileTypeXYZ(details))
{
chrome.tabs.sendMessage(details.tabId, {isFileXYZ: true});
return { //Stop rendering of frame...
responseHeaders: [{
name: 'X-Content-Type-Options',
value: 'nosniff'
}, {
name: 'X-Frame-Options',
value: 'deny'
}]
};
}
}, {
urls: ['*://*/*'],
types: ['main_frame']
}, ['blocking', 'responseHeaders']);
在我的脚本中,我有以下代码:
var toLoadXYZ = 0;
chrome.runtime.onMessage.addListener(function(msg, _, sendMessage){
if(msg.isFileXYZ)
{
toLoadXYZ = 1;
}
});
$(document).ready(function(){
alert(toLoadXYZ);
});
我想要做的是检测是否正在打开特定文件类型,然后从系统自身运行的服务器加载图像并显示它。我将不得不使用xhr加载图像,但我需要首先使这个检测工作正常。我面临两个问题:
alert(toLoadXYZ)
中显示的值为0而不是1,即使调试器显示触发了onMessage(首次加载后 - 首次加载后我使用F5刷新页面)。如果您想参考,这是清单文件:
{
"manifest_version": 2,
"name": "my Extension",
"version": "1.0",
"background": {
"scripts": ["background.js"],
"persistent": true
},
"permissions": [
"webRequest",
"<all_urls>",
"webRequestBlocking",
"tabs",
"webNavigation"
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["jquery-2.1.4.min","renderXYZ.js"]
}
],
"web_accessible_resources": [ "http:/*", "https:/*", "ftp:/*", "file:/*", "chrome-extension:/*"]
}
这个问题的原因是什么?怎么解决?我搜索了很多没有得到任何有用的请帮助!!
更新
function findContentType(responseHeaders)
{
for(var i = 0; i < responseHeaders.length; i++)
{
var header = responseHeaders[i];
if(header.name.toLowerCase() === "content-type")
return header.value.toLowerCase();
}
return "";
}
function isfileTypeXYZ(details)
{
var contentType = findContentType(details.responseHeaders);
if(contentType === "some-mime-type-here")
{
return true;
}
return false;
}
答案 0 :(得分:2)
chrome.runtime.onMessage
,但它在之前请求的内容脚本上被调用。由于您正在刷新页面,因此tabId
不会更改,因此您可以在新主体加载之前将消息发送到上一页的内容脚本,这就是您的原因所在&#0} #39;看到这种行为。也许更清楚:
onHeadersReceived
被称为chrome.tabs.sendMessage
但由于尚未加载内容脚本,因此无法触发任何内容。onHeadersReceived
会调用此新请求,但该选项卡的内容仍然是上一个请求的内容。您可以在此处看到提醒以及toLoadXYZ
为0的原因。