通过代码创建元素时,我遇到了一个问题,即修改元素的innerHTML
属性会破坏对修改前注入修改元素的其他元素的任何引用。
我在这里有一个测试用例:http://jsfiddle.net/mJ7bF/1/我期望link1
引用的行为与link2
完全相同。
第二个测试用例是相同的代码,但我没有使用innerHTML
属性来添加<br>
标记,而是使用对象创建换行符。此测试的行为符合预期:http://jsfiddle.net/K4c9a/2/
我的问题不是关于这个特定的代码,而是它背后的概念:在第一个测试用例中link1
引用会发生什么?如果它没有引用在cont
节点注入文档时可见的HTML / DOM节点,它引用了什么,以及它如何适应javascript对象的ByReference性质? / p>
答案 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标记被重新创建为新的对象实例。