gpt4 book ai didi

javascript - 如何从 Firefox 扩展覆盖 JavaScript 函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:07:35 25 4
gpt4 key购买 nike

我正在尝试拦截对所有页面的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com