加载页面后如何从内容脚本中 运行 回调函数? chrome 分机
How to run callback function from content script after loading page ? chrome extension
我想 运行 在选项卡加载新页面后从内容脚本中调用回调函数。
这是我的代码:
content_script.js
chrome.runtime.onMessage.addListener(function(request, sender, callback) {
if (request.id == "content_script") {
// open google.com
chrome.runtime.sendMessage({
"id" : "openUrl",
"url" : "https://google.com"
}, function(response) {
});
// call background script
// go to the claim code page
chrome.runtime.sendMessage({
"id" : "background"
}, function() {
alert("test");
});
}
});
background.js
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg.id == "openUrl") {
var tabId = sender.tab.id;
var url = msg.url;
openUrl(tabId, url);
} else if (msg.id == "background") {
setTimeout(function() {
sendResponse();
}, 5000);
}
});
function openUrl(tabId, url) {
chrome.tabs.update(tabId, {
url : url,
active : false
}, function() {
console.log("open tab url callback");
});
};
我也把源代码上传到google驱动器,你可以使用下面的link下载它:
https://drive.google.com/open?id=15zSn40z4zYkvCZ8B-gclzixvy6b0C8Zr
如您所见,警报测试未显示!
但是,如果我删除打开新 url 的代码,则会出现警报 ("test") !
我不知道为什么!但看起来 javascript 在我打开新 url 时丢失了对回调函数的引用。
我该如何解决这个问题?正确的方法是什么?
谢谢
消息回调returns后sendResponse
函数失效,除非你returntrue从事件侦听器以指示您希望异步发送响应。 (https://developer.chrome.com/extensions/runtime#event-onMessage)
在 background.js 中添加 return true;
以使此处理程序异步。
现在您在 background.js 的 sendResponse();
调用中收到错误 Attempting to use a disconnected port object
,是的,这是页面导航离开并丢失上下文的结果内容脚本是 运行 in.
没有办法让它工作:你想调用 alert()
的上下文已经不存在了。
请尝试使用 chrome.tabs.sendMessage。但这意味着您必须在顶层设置监听器,而不是在任何回调内部。消息传递很难。
我想 运行 在选项卡加载新页面后从内容脚本中调用回调函数。
这是我的代码:
content_script.js
chrome.runtime.onMessage.addListener(function(request, sender, callback) {
if (request.id == "content_script") {
// open google.com
chrome.runtime.sendMessage({
"id" : "openUrl",
"url" : "https://google.com"
}, function(response) {
});
// call background script
// go to the claim code page
chrome.runtime.sendMessage({
"id" : "background"
}, function() {
alert("test");
});
}
});
background.js
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg.id == "openUrl") {
var tabId = sender.tab.id;
var url = msg.url;
openUrl(tabId, url);
} else if (msg.id == "background") {
setTimeout(function() {
sendResponse();
}, 5000);
}
});
function openUrl(tabId, url) {
chrome.tabs.update(tabId, {
url : url,
active : false
}, function() {
console.log("open tab url callback");
});
};
我也把源代码上传到google驱动器,你可以使用下面的link下载它: https://drive.google.com/open?id=15zSn40z4zYkvCZ8B-gclzixvy6b0C8Zr
如您所见,警报测试未显示!
但是,如果我删除打开新 url 的代码,则会出现警报 ("test") !
我不知道为什么!但看起来 javascript 在我打开新 url 时丢失了对回调函数的引用。
我该如何解决这个问题?正确的方法是什么?
谢谢
消息回调returns后
sendResponse
函数失效,除非你returntrue从事件侦听器以指示您希望异步发送响应。 (https://developer.chrome.com/extensions/runtime#event-onMessage)在 background.js 中添加
return true;
以使此处理程序异步。现在您在 background.js 的
sendResponse();
调用中收到错误Attempting to use a disconnected port object
,是的,这是页面导航离开并丢失上下文的结果内容脚本是 运行 in.没有办法让它工作:你想调用
alert()
的上下文已经不存在了。请尝试使用 chrome.tabs.sendMessage。但这意味着您必须在顶层设置监听器,而不是在任何回调内部。消息传递很难。