[英]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.