不幸的是,使用突变观察者的建议不适用于这种情况。突变观察者不知道将 dom 节点添加到页面的原因,他们只报告有一个。这意味着无法确定是否添加了 DOM 的一部分是因为页面仍在加载,还是因为脚本已触发并动态添加内容。
然而
本文解释了如何覆盖 dom 中每个元素的 InnerHTML getter/setter 属性:http :
//msdn.microsoft.com/en-us/library/dd229916 (v=vs.85).aspx 由于 InnerHTML总是由 javascript 调用,我知道是否使用此函数调用加载了 dom 的某个部分变得微不足道。
虽然这对于大多数应用程序来说几乎肯定是矫枉过正并且不是一个好主意,但对于像这种奇怪的情况以及 js 框架的构建,它可能很有意义。
如果该文章在某个时候下线,我的初始代码类似于以下内容:
var elem = isInIE() ? HTMLElement : Element; // IE and FF have different inheritance models, behind the scenes.
var proxiedInnerHTML = Object.getOwnPropertyDescriptor(elem.prototype, "innerHTML");
Object.defineProperty(elem.prototype, "innerHTML", {
set: function ( htmlContent )
{
// custom code goes here
proxiedInnerHTML.set.call(this, htmlContent);
});
在较旧的浏览器中应该警告一个人,或者如果您使用了错误的元素(HTMLElement vs Element),调用将在innerHTML调用上失败,而不是在属性定义上。
在浏览器中处理原型:
我在 FF 和 IE 中测试了这个块,但在 Chrome 中没有。更重要的是,我发现帖子指出 w3c 规范中没有保证指定浏览器如何处理其元素类型的继承,因此不能保证 HtmlDivElement 将来或过去会调用 InnerHTML 的 HtmlElement 或 Element 基方法任何给定浏览器的版本。
也就是说,使用所有保留的 html 关键字创建一个网页非常简单,并测试这种技术是否适用于它们。对于 IE 和 FF,截至 2015 年 1 月,此技术适用于所有领域。
旧浏览器支持:
虽然我没有使用它,但在较旧的浏览器中,您可以使用
document.__defineGetter__("test", /* getter function */ );
document.__defineSetter__("test", /* setter function */ );
document.__lookupGetter__("test");
document.__lookupSetter__("test");
感谢 RobG 让我走上这条路