我能想到两种可能的方法:
1 - 使用定时器检查脚本是否存在,如果不存在,则重新添加...
2 - 检查ajax调用,如果它们的url与删除您的脚本之一的url匹配,则再次添加脚本。
即使经过ajax调用后,您定义在清单中的脚本仍然存在,但它不会再次运行(不确定历史推动器会发生什么)。因此,我假设您只需要重新添加一些元素或重新运行该脚本。我认为您是通过附加html标记来添加脚本的。
因此,您需要的是重新添加元素或重新运行某些代码的内容。
1 - 定时器方法 - 我创建了一个解决方案,用于将任何元素(而不仅仅是脚本)添加到页面上的特定目标元素中。
它使用定时器检查目标元素是否存在。当它找到目标元素时,它会添加我的元素。然后调整定时器以检查我的元素是否仍然存在。如果不存在,则再次添加。
您只需要一次调用appendChildPersistent,这将在您浏览时始终保持活动状态。
var timers = {};
appendChildPersistent = function(id, child, toElem, callback)
{
withLateElement(toElem, function(target)
{
target.append(child);
if (typeof callback !== 'undefined') callback();
timers[id] = setInterval(function()
{
if (document.getElementById(id) === null)
{
clearInterval(timers[id]);
delete timers[id];
appendChildPersistent(id, child, toElem, callback);
}
},3000);
});
}
function withLateElement(selector, doAction)
{
if (!(selector in timers))
{
timers[selector] = setInterval(function(){
var elem = $(selector);
if (elem.length >= 0)
{
if (typeof elem[0] !== 'undefined')
{
clearInterval(timers[selector]);
delete timers[selector];
doAction(elem);
}
}
}, 2000);
}
}
(1) 对于在script标签中添加Id,似乎并不是问题:给script标签添加ID
2 - 捕获ajax调用
一种方法是使用chrome.webRequest。但奇怪的是,这对我并没有起作用。另一种选择如下。
对于这种情况,请查看这个答案,并不要忘记阅读其中与Chrome扩展程序相关的答案。只有按照整个过程操作才能使其正常工作。幸运的是,我今天测试了一下,它非常好用:p
在这里,您需要更改XMLHttpRequest
方法open
和send
来检测(并可能获取参数),以确定它们何时被调用。
然而,在Google扩展程序中,您绝对必须将代码注入页面(不是后台页面或脚本注入内容脚本的页面,而是您的内容脚本将某些代码注入到dom中,例如以下代码)。
var script = document.createElement('script');
script.textContent = actualCode; //actual code is the code you want to inject, the one that replaces the ajax methods
document.head.appendChild(script); //make sure document.head is already loaded before doing it
script.parentNode.removeChild(script); //I'm not sure why the original answer linked removes the script after that, but I kept doing it in my solution
这很重要,因为扩展程序试图创建一个隔离的环境,在这个环境中对
XMLHttpRequest
所做的更改将不起作用。(这就是为什么 JQuery.ajaxComplete 似乎无法工作,你需要在页面中注入脚本才能使其工作-请看
这里)
在
这种纯JavaScript解决方案中,您需要替换方法:
(function() {
var XHR = XMLHttpRequest.prototype;
var open = XHR.open;
var send = XHR.send;
XHR.open = function(method, url) {
this._method = method;
this._url = url;
return open.apply(this, arguments);
};
XHR.send = function(postData) {
this.addEventListener('load', function() {
addMyElementsToPage();
console.log("The method called in this request was: " + this._method);
console.log("The url of this request was: " + this._url);
console.log("The data retrieved is: " + this.responseText);
});
return send.apply(this, arguments);
};
})();