如何从Firefox扩展重写JavaScript函数?

如何从Firefox扩展重写JavaScript函数?,javascript,firefox-addon,document.write,Javascript,Firefox Addon,Document.write,我正在尝试拦截对所有页面的document.write的调用。通过注入脚本在页面内设置拦截,如 function overrideDocWrite() { alert("Override called"); document.write = function(w) { return function(s) { alert("special dom"); w.call(this, wrapString(s)); }; }(document.write); alert("

我正在尝试拦截对所有页面的document.write的调用。通过注入脚本在页面内设置拦截,如

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");
}
这很简单,也很有效,但是我希望我的扩展能够从扩展内部为每个文档对象设置拦截。我找不到这样做的方法。我试图监听“加载”事件并在那里设置拦截,但也失败了。如何从扩展名钩住对
doc.write
的调用

我取得了一些进展:

var myExtension={
init:function(){
var appcontent=document.getElementById(“appcontent”);//浏览器
如果(应用内容)
appcontent.addEventListener(“DOMContentLoaded”,myExtension.onPageLoad,
正确的);
},
onPageLoad:功能(aEvent){
var doc=aEvent.originalTarget;//doc是触发“onload”事件的文档
//对加载的页面执行一些操作。
//doc.location是一个location对象(参见下面的链接)。
//您可以使用它使代码仅在某些页面上执行。
警报(“被调用的覆盖”);
警报(doc);
警报(文件写入);
警报(文件wrappedJSObject);
警报(doc.wrappedJSObject.write);
doc.wrappedJSObject.write=函数(w){
返回函数{
警报(“特殊dom”);
w、 调用(此“(“+s+”);
};
}(书面文件);
警报(“覆盖完成”);
}

}
JavaScript使用原型继承系统,而不是类,对象有原型。原型是真实的对象,用作继承方法和属性时对其他对象的引用

最好的策略是重写在“document”原型中编写的方法(对于HTML文档,该原型是HTMLDocument)。这将有效地将所有“文档”实例的方法包装在浏览器中加载的页面中,因为它们都使用相同的原型

而不是

document.write = function() { ... }
试着这样做:

HTMLDocument.prototype.write= function() { ... }

更新:这似乎不像我最初认为的那么简单,第一次尝试时似乎不起作用。

问题的答案!我得到了答案。下面是一个示例代码:

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开始插入事件文档元素的文档也是如此。

它似乎不起作用:-/赋值是正确的:如果我这样做:HTMLDocument.prototype.write=function(str){alert(str)};然后alert(HTMLDocument.prototype.write)显示我的函数。但是document.write-in-pages不调用我的自定义函数。@BruceBerry。对不起,你说得对,我刚测试过。尽管我从未以这种方式使用过它,但我相信它会起作用。我尝试从浏览器中的不同上下文访问HTMLDocument.prototype。它工作的唯一方式是当HTMLDocument.write=function(){..}在页面本身中时,但这又回到了最初的问题,即如何在页面加载之前将其放在那里。我会尝试一些其他的想法。。。同时,如果你找到了解决方案,就把它贴在这里!我想出了一种不同的方法来避开不得不介入document.write的步骤。但这并不意味着这是不可能的:-)事实上,我希望覆盖window.print,但问题是相同的。大多数DOM提供的函数都是不可写的,
document.write包含在内。Firefox会给你们一个错误,告诉你们只提供了一个getter。我并没有测试document.write,但它在实际项目中适用于许多其他项目。我在Firefox3.6和4.0上使用了它。自那以后,情况可能发生了变化。