簡體   English   中英

如何從Firefox擴展中覆蓋JavaScript函數?

[英]How to override JavaScript function from a Firefox extension?

我試圖攔截所有頁面的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"); // 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的文檔也是如此。

JavaScript使用原型繼承系統,而不是擁有類,對象具有原型。 原型是真實對象,用作對其他對象的引用,用於繼承方法和屬性。

最好的策略是覆蓋“文檔”原型中的方法寫入(對於HTML文檔是HTMLDocument)。 這應該有效地將所有“文檔”實例的方法包裝在瀏覽器中加載的頁面中,因為它們都使用相同的原型。

代替

document.write = function() { ... }

嘗試這樣的事情:

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

更新:它似乎並不像我最初想象的那么容易,這似乎在第一次嘗試時不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM