我非常接近让我的Chrome扩展程序完美运行,但现在又遇到了最后一期。
问题似乎与在Facebook等网站上反复注入的内容脚本有关,在点击链接等时不会重新加载整个页面......
我认为这个问题与网站非常依赖AJAX有关。
如果我刷新整个页面,或者是第一次加载它,那么就没有问题了。我的扩展程序运行并正确注入内容脚本。
但是,如果我在初始时加载页面,然后点击网站上的链接,Facebook的“内容部分”将加载您点击的任何链接,而顶部的浮动蓝色导航栏不会刷新或改变。</ p>
即。整个页面不会重新加载。由于站点的“内容部分”和导航栏都在同一帧中,因此内容脚本只会为您单击的每个链接再次注入。
所以最终我在我的控制台日志中看到它正在运行2X,3X,4X,5X等。当我点击更多链接时,每次增加1个数字。
所以我的问题是:
在再次注入内容脚本之前,是否有一种简单的方法可以检查内容脚本是否已存在/处于活动状态?或者还有什么可以用作解决这种情况的解决方法?
答案 0 :(得分:1)
在父框架中,您可以添加window.doneInjecting = true;
或类似内容吗? (或者可能在页面中添加一个隐藏元素 - 我不确定子帧是否可以访问其父级的JavaScript变量)
但基本上设置一个简单的标志,以便每次注入内容脚本时,检查标志是否存在,只有在没有时才继续?
答案 1 :(得分:1)
我在为扩展程序编写内容脚本时预测了类似的问题,因此我在每个页面的<body>
元素中添加了一个唯一属性,其中包含扩展名和版本。
内容脚本做的第一件事就是检查这个属性是否已经编写脚本,如果有,则停止。否则,它将添加此属性(值为true
)并继续其目的。
如果你想看到我的solution;
这种技术稍微复杂一点的方面是使用message passing获取版本并将清单(在AJAX请求中检索)解析为JSON对象。
要确切了解我如何实现这一目标init
和onRequestHelper
函数here;
当然,您可以对该版本进行硬编码或完全省略。只要属性名称是唯一的。
答案 2 :(得分:1)
onUpdated都会触发。只需在changeInfo.status == "complete"
<强> background.js 强>
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
chrome.tabs.getSelected(null, function(tab) {
// Do some stuff
if (changeInfo.status == "complete")
{
// load your scripts here
chrome.tabs.executeScript(tabId, {file: "jquery.js"});
chrome.tabs.executeScript(tabId, {file: "jquery.highlight.js"});
}
});
});