作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试拦截对所有页面的 document.write 调用。通过注入(inject)脚本在页面内设置拦截
function overrideDocWrite() {
alert("Override called");
document.write = function(w) {
return function(s) {
alert("special dom");
w.call(this, wrapString(s));
};
}(document.write);
alert("Override finished");
}
既简单又有效,但我希望我的扩展程序能够为扩展程序内部的每个文档对象设置拦截。我找不到办法做到这一点。我试图监听“加载”事件并在那里设置拦截,但它也失败了。如何 Hook 从扩展程序调用 doc.write
?
我取得了一些进步:
var myExtension = {
init: function() {
var appcontent = document.getElementById("appcontent"); // browser
if (appcontent)
appcontent.addEventListener("DOMContentLoaded", myExtension.onPageLoad,
true);
},
onPageLoad: function(aEvent) {
var doc = aEvent.originalTarget; // doc is document that triggered "onload" event
// do something with the loaded page.
// doc.location is a Location object (see below for a link).
// You can use it to make your code executed on certain pages only.
alert("Override called");
alert(doc);
alert(doc.write);
alert(doc.wrappedJSObject);
alert(doc.wrappedJSObject.write);
doc.wrappedJSObject.write = function(w) {
return function(s) {
alert("special dom");
w.call(this, "(" + s + ")");
};
}(doc.write);
alert("Override finished");
}
}
这似乎可行,但 DOMContentLoaded 是该工作的错误事件,因为它触发得太晚了!是否有更早的事件可以收听?
最佳答案
问题的解决!我得到了答案。这是一个示例代码:
const os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
os.addObserver({
observe : function(aWindow, aTopic, aData) {
if (aWindow instanceof Ci.nsIDOMWindow && aTopic == 'content-document-global-created') {
aWindow.wrappedJSObject.myfunction = function(){
// Do some stuff . . .
}
}
}
}, 'content-document-global-created', false);
从 gecko 2.0 开始,带有事件 document-element-inserted 的文档也是如此。
关于javascript - 如何从 Firefox 扩展覆盖 JavaScript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2947327/
我是一名优秀的程序员,十分优秀!