我的Chrome扩展程序会将内容脚本注入每个页面("matches": ["http://*/*", "https://*/*"]
)。内容脚本将向后台页面发送消息(chrome.extension.sendRequest
),后台页面将注册一个事件处理程序:
chrome.extension.onRequest.addListener(
function (request, sender, callback) {…}
);
我注意到,当我开始输入多功能框时,这些事件会被触发 - 甚至在我按Enter键加载目标页面之前。
情景:
chrome.extension.onRequest.addListener()
事件处理程序[background.html]就会被触发。奇怪的是sender.tab.index值为-1,因此它不会映射到“真实”选项卡。此外,当我继续将焦点从多功能框切换回来时,事件继续发射。每次sender.tab.index为-1,但sender.tab.id增加2(43,45,47,...)。这种行为很容易重现。
然后,当我通过在多功能框中点击Enter来实际选择一个URL(比如example.com),然后在浏览器/选项卡中加载页面时,我又得到另一个事件。但是,这次sender.tab.index是非负的 - 它代表实际的浏览器选项卡,我的内容脚本处理程序可以完成它的工作。
这种行为 - 内容脚本是否被注入到多功能行为操作的“幻像”页面中 - 已知,是否记录在任何地方?我的事件处理程序处理这个问题的正确方法是什么?假设我的内容脚本处理程序需要操作网页。我应该检查sender.tab.index,只在sender.tab.index != -1
?
答案 0 :(得分:1)
没有发生的那么多。预渲染页面的行为是预期的,但这应该不那么频繁。在这些情况下,您可以在内容脚本中使用Page Visibility API,除非页面可见,否则不会向背景页面发送消息。
您还应该为内容脚本注入的极端数量的“标签”提交bug report。
答案 1 :(得分:1)
您所描述的行为称为“Chrome即搜即得”搜索,它涉及Chrome准备隐藏搜索结果标签,然后将其更换为可见标签,以便更快地感知搜索结果。 Chrome有时会“预渲染”其他网页,以加快感知页面加载速度。
是的,标签ID为-1表示该标签当前是幻像标签(用户无法访问)。
我还没有在任何地方找到幻像(预渲染)标签的任何详细文档,但是当Chrome用预渲染标签替换普通标签时,有两个事件被触发,他们的文档确实提到了预渲染和Chrome即时消息:
答案 2 :(得分:0)
Google扩展程序的API未完整记录,并且存在大量未记录的行为。从多功能框发射的这些事件并不新鲜,也没有记录。
我建议不要自动注入内容脚本,而是以编程方式执行,作为对chrome.tabs.onUpdated事件的响应。
http://code.google.com/chrome/extensions/tabs.html#event-onUpdated
它将触发每个网址的标签更改。您应该在background.html中收听它,然后使用chrome.tabs.executeScript执行内容脚本。
http://code.google.com/chrome/extensions/tabs.html#method-executeScript
通过这种方式,您可以在执行内容脚本之前验证选项卡的ID和URL。
顺便说一句,我假设您的匹配模式是http:// * / *