元素引用在修改容器的内部 HTML 属性时中断
Element reference breaks on modification of innerHTML property of container
通过代码创建元素时,我遇到了一个问题,即修改元素的innerHTML
属性会破坏对修改之前注入到修改元素中的其他元素的任何引用。
我这里有一个测试用例:http://jsfiddle.net/mJ7bF/1/我希望link1
引用的行为与link2
完全相同。
第二个测试用例是相同的代码,但我不是使用 innerHTML
属性添加 <br>
标记,而是使用对象创建换行符。 此测试的行为符合预期:http://jsfiddle.net/K4c9a/2/
我的问题不是关于这个特定的代码,而是它背后的概念:第一个测试用例中的link1
引用会发生什么?如果它不引用当cont
节点注入文档时可见的 HTML/DOM 节点,它指的是什么,它如何与 javascript 对象的 ByReference 性质相适应?
的事情。
首先,字符串是不可变的,因此执行element.innerHTML += "<br>"
就像完全读取和重写一样。
第二,为什么不好:
除了性能之外,Mootools(和jQuery)为所有引用的元素分配特殊的唯一顺序UID。 您可以通过调用元素上的选择器或创建元素等来引用元素。
然后考虑那个特定的元素,uid
说 5。 uid
链接到一个名为 Storage
的特殊对象,该对象位于闭包后面(因此是私有的)。 它以uid
作为键。
然后,元素存储工作在element.store("key", value")
和element.retrieve("key")
最后,为什么这很重要:events
被存储在元素存储中(例如,存储[5]['events']) - 如果你好奇,请做element.retrieve("events")并在fireBug中探索它。
当你重写内部HTML时,旧元素将停止存在。 然后重新创建它,但事件处理程序和对之前绑定的函数的引用将不再工作,因为它现在将获得新的uid
。
就是这样,希望它有意义。
要添加 BR,只需new Element("br").inject(element)
或为该批次创建一个模板化片段(最快)并添加 1 大块,然后在之后添加事件。
内部由DOM对象结构表示。 有点像传统编程语言中的树类。 如果设置 innerHTML,则会销毁父节点中的先前节点,解析新的 innerHTML,并创建新对象。 引用不再相同。
div
|-- a..
上面的div 对象包含一个作为子对象的 Anchor 对象。 现在,将变量 link1 设置为对此 Anchor 对象的地址的引用。 然后 .innerHTML 被+= "<br />"
,这意味着div 的所有节点都被移除,并根据 .innerHTML 新值的解析结果动态重新创建。 现在,旧引用不再有效,因为 Anchor 标记已重新创建为新的对象实例。
- Javascript内部HTML动画
- Javascript,在body_class()=登录时更改内部html
- 如何从data_response获取父元素内部的html
- 如何自动将页码添加到HTML页面上的所有内部链接
- 带有输入值的内部HTML
- 内容可编辑分区-根据内部HTML位置的光标位置
- 如果通过字符串变量发送,HTML内部的子窗口将显示为文本
- inner.html内部的JavaScript函数调用
- 如何从 html 内部的角度.js调用源函数
- 使用JavaScript引用HTML内部标记
- 如何从Html内部的JavaScript函数中获取返回值
- 重新安排HTML内部Div
- 图像库与覆盖和html内部不能覆盖正确的图像.jquery
- 无法读取未定义的HTML内部属性
- 导入外部HTML内部内容与Javascript AJAX没有Jquery
- 如何更新html内部的元素
- .每个通过HTML内部变量
- 脚本代码语法..html内部注释
- 使用$(文档).准备好了一个HTML内部的变量
- JavaScript从任意URL的HTML内部获取一些信息