我正在尝试使用chrome扩展程序,并尝试依靠sendMessage来清理我的一些代码。然而,回调函数在页面加载完成之前激活,因此在新选项卡的情况下,没有人收到,并且在现有选项卡的情况下,正在移动的页面正在获取消息(但这不是我想要的)。我已经找了其他人用新标签询问这个问题并且没有明确的答案,我看到的最好的建议是创建一个全局变量并为tab加载创建一个监听器并将它与这个全局变量进行比较
所以问题是,有没有办法等待回调函数直到页面加载,或者我是否创建了一个JS对象数组,其中包含我正在等待的选项卡以及我要发送给的信息那个标签。
这里参考的是后台javascript文件中的相关代码。
chrome.tabs.sendMessage(tab.id, {info: "info"}, function(response)
{
//This line isn't used when I am navigating without changing tabs
chrome.tabs.create({url: response.info.linkUrl}, function(tab1)
{
chrome.tabs.update(tab1.id, {url: response.info.linkUrl}, function(tab2)
{
chrome.tabs.sendMessage(tab2.id, {info: "More Info"});
});
});
});
否则我能够确认我的所有标签边码都有效,一旦我的sendMessage延迟到足以让我亲眼看到它。我的代码能够始终如一地通过导航的页面进行验证,通过检查document.url确认。
答案 0 :(得分:1)
您可以尝试注入第二个内容脚本而不是邮件。 它将在与其他脚本相同的上下文中执行。
的内容
chrome.tabs.executeScript(tab2.id,
{code: 'showInfo("More Info);', runAt: 'document_idle'}
);
其中showInfo
与您的消息处理程序的作用相同。
这有点像黑客,我不能100%确定加载顺序是否正确。
其他可能的解决方案更复杂。
例如,您可以将内容脚本报告恢复为已准备好并具有该处理程序,例如,您可以在后台注册onMessage
的侦听器,等待来自该特定选项卡的消息.id,发送"更多信息"然后是deregisters or disables itself。
或者,您可以切换到内容脚本的程序化注入,这样可以控制加载顺序。