向DOM Element对象添加属性有什么问题?

ste*_*and 24 javascript dom object

我一直在寻找一个直接的答案(我可以想到很多可能性,但我想知道真正的原因):

jQuery提供了一个.data()方法,用于将数据与DOM Element对象相关联.是什么让这有必要?将属性(或方法)直接添加到DOM元素对象是否有问题?它是什么?

bob*_*nce 43

将属性(或方法)直接添加到DOM元素对象是否有问题?

潜在的.

没有Web标准说您可以向DOM节点添加任意属性.它们是具有浏览器特定实现的"主机对象",而不是"本机JavaScript对象",根据ECMA-262,您可以执行您喜欢的操作.其他主机对象不允许您添加任意属性.

实际上,因为最早的浏览器确实允许你这样做,所以它无论如何都是事实上的标准......除非你故意告诉IE通过设置禁止它document.expando= false.您可能不会自己这样做,但如果您正在编写要在其他地方部署的脚本,那么您可能会担心.

任意属性存在实际问题,因为您实际上并不知道您选择的任意名称在某些尚未测试的浏览器中或在未来版本的浏览器中没有现有含义或尚不存在的标准.添加一个属性element.sausage= true,你无法确定任何时间空间和时间的浏览器都不会使用它作为信号来吸引令人兴奋的DOM Sausage Make The Browser Crash功能.因此,如果你确实添加了一个任意属性,请确保给它一个不太可能的名称,例如element._mylibraryname_sausage= true.这还有助于防止名称空间与可能添加任意属性的其他脚本组件发生冲突.

IE中还存在一个问题,即您添加的属性被错误地视为属性.如果你序列化元素,innerHTML你会在输出中得到一个意外的属性,例如.<p _mylibraryname_sausage="true">.如果您将该HTML字符串分配给另一个元素,您将在新元素中获得一个属性,可能会使您的脚本混乱.

(注意这只适用于值为简单类型的属性;对象,数组和函数不会出现在序列化HTML中.我希望jQuery知道这一点,因为它实现data方法的方法非常糟糕,导致错误,并减慢许多简单的DOM操作.)

  • 问题是(1)当你对HTML进行操作时(例如`html()`或`clone()`),jQuery必须从HTML中删除`jQuery(number)`属性.它通过(uuuurrrrrgghhh)通过正则表达式将字符串粘在一起来做到这一点.因此,如果您克隆包含文本`jQuery0 ="foo"`的段落,文本将消失.(2)现在它必须跟踪ID,DOM操作应该快速而简单.例如,尝试`remove()`一个元素,并观察jQuery递归到每个后代节点,寻找丢弃的数据ID.噢亲爱的. (7认同)
  • +1,虽然我希望你提到过HTML5`data-*`storage(http://dev.w3.org/html5/spec/Overview.html#attr-data).WRT到jQuery,`data`存储实现为一个expando属性,存储1个数值,映射到`jQuery.cache`中的键.理论上,浏览器在卸载时可以自由地回收"jQuery.cache",因为它没有附加到任何DOM元素,相反,DOM元素可以自由地进行垃圾收集,因为它不存储任何自引用对象/函数/等等.我没有看到那里的问题? (3认同)
  • 是的,但是如果将它们连接到DOM节点,大多数JS对象都不会泄漏内存.主要的时间内存泄漏是当对象是一个函数关闭循环引用回到节点,在IE中(直到IE7并且在IE6中具有更差的长期影响).jQuery试图平滑浏览器错误,最终会给每个人带来最低分辨率的表现.(并在此过程中添加自己较小的内存泄漏,从问题1462649判断.) (3认同)

Koo*_*Inc 5

我认为您可以添加所需的所有属性,只要您自己只需要使用它们,并且该属性不是方法或包含方法的某个对象.这有什么问题,方法可能会在浏览器中造成内存泄漏.特别是当你在这种方法中使用闭包时,浏览器可能无法完成垃圾清理,导致分散的内存和平占用.

这个链接解释得很好.

在这里,您将找到几种常见内存泄漏模式的描述