我一直在寻找一个直接的答案(我可以想到很多可能性,但我想知道真正的原因):
jQuery 提供了 .data() 方法来将数据与 DOM Element 对象关联起来。是什么使得这有必要?直接向 DOM 元素对象添加属性(或方法)是否存在问题?它是什么?
直接向 DOM 元素对象添加属性(或方法)是否存在问题?
有潜力。
没有 Web 标准规定您可以向 DOM 节点添加任意属性。它们是具有特定于浏览器的实现的“主机对象”,而不是“本机 JavaScript 对象”,根据 ECMA-262,您可以使用“本机 JavaScript 对象”执行您喜欢的操作。其他主机对象不允许您添加任意属性。
事实上,由于最早的浏览器确实允许你这样做,所以这是一个de facto标准,你无论如何都可以......除非你故意告诉 IE 通过设置禁止它document.expando= false
。您自己可能不会这样做,但如果您正在编写要部署在其他地方的脚本,那么您可能会担心。
任意属性存在一个实际问题,因为您不really知道您选择的任意名称在您尚未测试的某些浏览器中或在尚不存在的浏览器或标准的未来版本中不具有现有含义。添加属性element.sausage= true
,并且您无法确定在空间和时间的任何地方没有任何浏览器会使用它作为信号来启用令人兴奋的 DOM Sausage 让浏览器崩溃功能。因此,如果您确实添加任意属性,请确保给它一个不太可能的名称,例如element._mylibraryname_sausage= true
。这还有助于防止命名空间与可能添加任意属性的其他脚本组件发生冲突。
IE 中还有一个问题,即您添加的属性被错误地视为属性。如果您使用序列化元素innerHTML
你会在输出中得到一个意想不到的属性,例如。<p _mylibraryname_sausage="true">
。如果您随后将该 HTML 字符串分配给另一个元素,您将在新元素中获得一个属性,这可能会混淆您的脚本。
(请注意,这只发生在值为简单类型的属性上;对象、数组和函数不会显示在序列化的 HTML 中。我希望 jQuery 知道这一点,因为它的工作方式是围绕它来实现data
方法绝对很糟糕,会导致错误,并减慢许多简单的 DOM 操作。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)