当你说...
我发现另一种方法是基于DOM变化时的情况,但这使得加载时间变得很长,DOM中的操作太多了,无法采用这种方法。我需要监听AJAX请求,并在它们完成后重新运行我的代码。
...你使用的是Mutation Events还是Mutation Observers?因为我认为Observers被设计来解决这个问题。我以前从未使用过Observers,使用了Mutation Summary。它似乎能够实现你想要的,只是它直到文档就绪/空闲(不确定哪个)才开始观察,所以你可能需要在文档就绪时进行扫描,然后启动Observer。
以下是我的测试代码(在内容脚本中)...
handleChanges = function(summaries) {
var ignore = {
SCRIPT: true,
NOSCRIPT: true,
CDATA: true,
'#comment': true
}
summaries.forEach(function(summary) {
summary.added.forEach(function(node) {
if (!ignore[node.nodeName] || (node.parentNode && !ignore[node.parentNode.nodeName]) && node.nodeValue.trim()) {
node.nodeValue='PAEz woz ere - '+node.nodeValue;
}
})
})
}
var observer = new MutationSummary({
callback: handleChanges,
rootNode: document,
observeOwnChanges: false,
queries: [{
characterData: true
}]
});
另一种检查XMLHttpRequest的方法是劫持它,只需在内容脚本中编写以下代码即可(在文档开始时).....
function injectScript(source) {
var elem = document.createElement("script");
elem.type = "text/javascript";
elem.innerHTML = source;
document.documentElement.appendChild(elem);
}
injectScript("("+(function() {
function bindResponse(request, response) {
request.__defineGetter__("responseText", function() {
console.warn('Something tried to get the responseText');
console.debug(response);
return response;
})
}
function processResponse(request,caller,method,path) {
bindResponse(request, request.responseText);
}
var proxied = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function(method, path, async) {
var caller = arguments.callee.caller;
this.addEventListener('readystatechange', function() {
if (this.readyState === 4)
processResponse(this,caller,method,path);
}, true);
return proxied.apply(this, [].slice.call(arguments));
};
}).toString()+")()");
我从超级有趣的Supper Happy Fun Blog学到了这个技巧,但你可能已经知道,这对于使用ajax技术的网站来说不够。通常你需要为该网站编写特定的代码,或者也可以使用Mutation Observer。
chrome.webRequest.onCompleted.addListener(function(){/*your code here*/});
放到后台页面怎么样? - Derek 朕會功夫@
符号。 - PAEz