Chrome扩展程序 - 内容脚本从AJAX链接/导航中多次堆积

时间:2011-10-20 12:11:52

标签: google-chrome google-chrome-extension google-chrome-devtools

我非常接近让我的Chrome扩展程序完美运行,但现在又遇到了最后一期。

问题似乎与在Facebook等网站上反复注入的内容脚本有关,在点击链接等时不会重新加载整个页面......

我认为这个问题与网站非常依赖AJAX有关。

如果我刷新整个页面,或者是第一次加载它,那么就没有问题了。我的扩展程序运行并正确注入内容脚本。

但是,如果我在初始时加载页面,然后点击网站上的链接,Facebook的“内容部分”将加载您点击的任何链接,而顶部的浮动蓝色导航栏不会刷新或改变。<​​/ p>

即。整个页面不会重新加载。由于站点的“内容部分”和导航栏都在同一帧中,因此内容脚本只会为您单击的每个链接再次注入。

所以最终我在我的控制台日志中看到它正在运行2X,3X,4X,5X等。当我点击更多链接时,每次增加1个数字。

所以我的问题是:

在再次注入内容脚本之前,是否有一种简单的方法可以检查内容脚本是否已存在/处于活动状态?或者还有什么可以用作解决这种情况的解决方法?

3 个答案:

答案 0 :(得分:1)

在父框架中,您可以添加window.doneInjecting = true;或类似内容吗? (或者可能在页面中添加一个隐藏元素 - 我不确定子帧是否可以访问其父级的JavaScript变量)

但基本上设置一个简单的标志,以便每次注入内容脚本时,检查标志是否存在,只有在没有时才继续?

答案 1 :(得分:1)

我在为扩展程序编写内容脚本时预测了类似的问题,因此我在每个页面的<body>元素中添加了一个唯一属性,其中包含扩展名和版本。

内容脚本做的第一件事就是检查这个属性是否已经编写脚本,如果有,则停止。否则,它将添加此属性(值为true)并继续其目的。

如果你想看到我的solution;

这种技术稍微复杂一点的方面是使用message passing获取版本并将清单(在AJAX请求中检索)解析为JSON对象。

要确切了解我如何实现这一目标initonRequestHelper函数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"});
    }
});
});