Javascript Chrome扩展postMessage&;听众

Javascript Chrome扩展postMessage&;听众,javascript,dom,events,google-chrome-extension,event-handling,Javascript,Dom,Events,Google Chrome Extension,Event Handling,我正在从我的扩展在网站DOM中注入一个脚本。脚本访问DOM对象并使用postMessage()返回。然后我在content.js中听这个&获取对象。有一个函数在DOM中注入这些脚本&期望对象返回。此函数被调用5次&需要5个不同的对象。第一个调用成功执行&返回addListener中的object1。但在此之后,侦听器将等待执行所有4个脚本&将对象保存在postMessage中。一旦加载了整个扩展,那么addEventListener最终将被调用&然后它将返回所有剩余的4个对象 为什么会有这种行为

我正在从我的扩展在网站DOM中注入一个脚本。脚本访问DOM对象并使用postMessage()返回。然后我在content.js中听这个&获取对象。有一个函数在DOM中注入这些脚本&期望对象返回。此函数被调用5次&需要5个不同的对象。第一个调用成功执行&返回addListener中的object1。但在此之后,侦听器将等待执行所有4个脚本&将对象保存在postMessage中。一旦加载了整个扩展,那么addEventListener最终将被调用&然后它将返回所有剩余的4个对象

为什么会有这种行为?如何从postMessage中获取对象 在addListener中而不被抓住

函数temp(){
var globalObject=`var globalObject=domObj;`;
var scriptHtml=[
全球对象,
`var obj=JSON.parse(JSON.stringify(globalObject));`,
`log(“DOM中的Obj”,Obj);`,
`window.postMessage(obj)`,
].加入(“”);
s、 innerHTML=scriptHtml;
文件。正文。附录子项;
var obj={};
window.addEventListener(
“信息”,
功能(事件){
//我们只接受来自我们自己的信息
如果(event.source!=窗口)返回;
if(事件数据){
obj=事件数据;
//log(“Content.js中的Obj”,Obj);
//port.postMessage(事件数据);
}
},
假的
);
返回obj;
}
“content.js”脚本是从“background.js”调用的

background.js

chrome.tabs.onUpdate.addListener(函数(tabId、changeInfo、tab){
日志(tabId、changeInfo、tab);
如果(changeInfo.status==“完成”){
Utils.executeScriptusingTabd(tabId,'content.js').catch(err=>{
控制台日志(err);
});
}
});
manifest.json

{
“清单版本”:2,
“姓名”:“我的分机”,
“说明”:“我的分机”,
“版本”:“5.0”,
“图标”:{
“128”:“images/icon.png”
},
“外部可连接”:{
“匹配项”:[“*://*.example.com/*”,“*:///localhost/*”]
},
“权限”:[
"",
“网络请求”,
“webRequestBlocking”,
“标签”,
“http://*/*”,
“https://*/*”
],
“背景”:{
“页面”:“background.html”
},
“浏览器操作”:{
“默认标题”:“我的扩展名”,
“默认图标”:“images/icon.png”,
“默认弹出窗口”:“popup.html”
},
“网络可访问资源”:[“images/*.png”、“helpers/*.js”]
}
content.js

console.time(“启动”);
从“/contentScripts/getPageVar”导入getPageVar;
从“/contentScripts/getPageVarFunc”导入getPageVarFunc;
从“/contentScripts/adsdottxtress”导入getAdsDotTxt;
从“jquery”导入$;
从“/libs/Utils.js”导入Utils;
设adsDotTxtResponse=false;
如果(!adsDotTxtResponse){
控制台日志(“无数据”);
getAdsDotTxt();
adsDotTxtResponse=true;
}
chrome.runtime.onMessage.addListener(函数(
{命令,数据},
发件人,
发送响应
) {
试一试{
开关(命令){
案例“getPageVar”:
sendResponse({success:true,data:getPageVar(data.pageVar)});
打破
案例“getPageVarFunc”:
sendResponse({success:true,data:getPageVarFunc(data.pageVar)});
打破
案例“setPrebidHandlers”:
log(“Case setprebiddhandlers”);
console.log(prebidenthandlerset);
如果(!PreBideventHandlerSet){
setPrebidHandlers();
PreBideventHandlerSet=真;
}
sendResponse({success:true,data:“Script executed”});
打破
案例“getAdsDotTxt”:
log(“发送ads.txt响应”);
如果(!adsDotTxtResponse){
控制台日志(“无数据”);
getAdsDotTxt();
adsDotTxtResponse=true;
sendResponse({success:true,data:“Fetching ads.txt data”});
}否则{
console.log(“发送数据”);
发送响应({
成功:没错,
数据:getPageVarFunc(
'document.getElementById(“\u My\u adsDotTxt”).innerText'
),
});
}
打破
案例“scrollAdToScreen”:
const status=Utils.scrollElementToScreen($(`div[id='${data.id}']`));
sendResponse({success:status,data:{status}});
打破
案例“highlightAds”:
Utils.borderifyAd(data.isMy);
sendResponse({success:true,data:{status:true}});
打破
案例“成人报告”:
Utils.getAdUnitReporting(data.isMy、data.toDate、data.fromDate);
sendResponse({success:true,data:{status:true}});
打破
案例“AppendAndLoadUrl”:
Utils.appendAndReloadURL(data.param);
sendResponse({success:true,data:{status:true}});
打破
}
}捕获(e){}
返回true;
});

很有趣。chrome.tabs.onUpdated中的状态类似于
status:“complete”
,它会多次报告,因此每次都会注入内容脚本并注册一个新的onMessage侦听器

尝试通过发送一条特殊消息(如
ping
)来检查内容脚本是否已在运行,onMessage应返回
true
,例如:

background.js:

chrome.tabs.onUpdate.addListener((tabId,changeInfo,tab)=>{
如果(changeInfo.status==‘完成’){
sendMessage(tabId,'ping',{frameId:0},ok=>{
如果(chrome.runtime.lastError | | |!确定){
Utils.executeScriptusingTabd(tabId,'content.js').catch(console.log);
}
});
}
});
content.js:

chrome.runtime.onMessage.addListener(函数(
{命令,数据},
发件人,
发送响应
) {
试一试{
开关(命令){
案例“平”:
sendResponse(true);
打破
//////////////////////
你的问题是什么