钩上appendChild时的比赛条件

时间:2018-08-09 10:33:17

标签: javascript html hook

钩上appendChild时,我遇到了一个非常奇怪的比赛条件。 考虑以下代码:

var RealAppend = IframeWindow.Element.prototype.appendChild;
IframeWindow.Element.prototype.appendChild = function(){
    RealAppend.apply(this, arguments); //some more code here --- >};

我要钩住一些iframe附加子元素,这就是为什么要使用IframeWindow作为iframe内容窗口来执行“ IframeWindow.Element.prototype.appendChild”。

现在,在钩上appendchild之后,我开始将节点追加到iframe中,其中一个节点是具有id =“ somediv”的简单div元素,另一个节点是javascript元素,并且一旦javascript执行后,它将使用document.createElement创建一个iframe并设置其属性,然后执行document.getElementById('somediv').appendChild(CreatedIframe); 它将创建的iframe附加到“ somediv”上,我的目标是拦截最后一个appendchild并也钩住该iframe的appendchild。 现在我首先想到的是,也许我实际上需要像这样覆盖appendchild:

someDiv.appendChild = function(){.....

但是经过更多测试后,我发现有时我的代码确实成功并挂接了最后一个iframe,有时SomeDiv.appendChild是本机代码,而我的代码失败了。

有什么想法吗?

编辑: 我认为这可能与我使用

的事实有关
document.createRange().createContextualFragment(strHTML);
}

将html解析为字符串,然后将节点附加到iframe,所以div(somediv)可能会从那里获取干净的appendChild?但是为什么有时它会起作用而有时却不起作用呢? 另一件事是,在页面加载后,我使用开发工具获取somediv.appendchild,每次都获取钩子代码,因此问题仅在执行javascript代码时发生

1 个答案:

答案 0 :(得分:1)

所以我设法弄清楚问题出在哪里,所以如果有人遇到这个问题,这里就是解决方案: 当我将html字符串解析到节点以便将它们附加到iframe时,我首先使用“ DOMParser” API,但我错过了DOMParser使用来自调用方contentWindow的文档的事实,因此没有像这样调用DOMParser: / p>

new DOMParser();

我需要这样称呼它:

new HookedIframeContentWindow.DOMParser();