元素引用打破了容器的innerHTML属性的修改

时间:2011-05-12 17:57:10

标签: javascript dom object mootools pass-by-reference

通过代码创建元素时,我遇到了一个问题,即修改元素的innerHTML属性会破坏对修改前注入修改元素的其他元素的任何引用。

我在这里有一个测试用例:http://jsfiddle.net/mJ7bF/1/我期望link1引用的行为与link2完全相同。

第二个测试用例是相同的代码,但我没有使用innerHTML属性来添加<br>标记,而是使用对象创建换行符。此测试的行为符合预期:http://jsfiddle.net/K4c9a/2/

我的问题不是关于这个特定的代码,而是它背后的概念:在第一个测试用例中link1引用会发生什么?如果它没有引用在cont节点注入文档时可见的HTML / DOM节点,它引用了什么,以及它如何适应javascript对象的ByReference性质? / p>

2 个答案:

答案 0 :(得分:3)

这里的事情很少。

首先。字符串是不可变的,因此执行element.innerHTML += "<br>"充当完整的读取和重写。

第二,为什么这很糟糕:

除了性能之外,mootools(和jquery,就此而言)为所有引用的元素分配特殊的唯一顺序uid。你通过调用一个元素或创建它来引用一个元素等。

然后考虑具有uid的SPECIFIC元素说5. uid链接到一个名为Storage的特殊对象,该对象位于闭包后面(因此它是私有的)。它以uid为关键。

元素存储然后适用于element.store("key", value")element.retrieve("key")

最后,为什么重要:events存储在元素存储中(例如,Storage [5] ['events']) - 执行element.retrieve(“events”)并在fireBug中探索它好奇。

当你重写innerHTML时,旧元素会停止存在。然后重新创建,但事件处理程序和之前绑定的函数的引用将不再有效,因为它现在将获得一个新的uid

就是这样,希望它有意义。

添加br只需执行new Element("br").inject(element)或为该批次创建模板化片段(最快)并添加1个大块,然后添加事件。

答案 1 :(得分:2)

HTML由DOM对象结构在内部表示。有点像传统编程语言中的Tree类。如果设置innerHTML,则会破坏父节点中的先前节点,解析新的innerHTML,并创建新对象。引用不再相同。

div
|-- a..

上面的div对象包含一个Anchor对象作为子对象。现在将变量link1设置为对此Anchor对象的地址的引用。然后.innerHTML是+= "<br />",这意味着div的所有节点都被删除,并根据.innerHTML的新值的解析结果动态重新创建。现在旧的引用不再有效,因为Anchor标记被重新创建为新的对象实例。