让我来改述一下问题:
这两个数据绑定选项之间的实际区别是什么?
实际上有三个选项:
$(e).prop('myKey', myValue);
$(e).data('myKey', myValue);
$(e).attr('data-myKey', myValue);
注意:OP的
e.myKey = myValue
实际上与
.prop()
行相同。
- 如果你需要更多的东西而不仅仅是字符串,请使用
.prop()
,即扩展属性
- 如果您需要DOM/CSS透明度和/或HTML序列化,请使用
.attr('data-*')
- 如果两者都需要,则没有运气了
- 如果你只使用字符串,但不需要DOM,请继续阅读以自我权衡利弊
- 关于
.data()
怎么样 → 阅读最后两段
如果您想要使用序列化的HTML来传递数据,则需要使用 .attr()
解决方案。 例如,每当您使用类似于 .innerHTML
或 .html()
的东西或者想要从包含数据的字符串构建片段时。 如果您想要使用CSS选择器,例如 elem[data-myKey]
。 缺点:您只能存储字符串。
如果您不需要在DOM中可见或可用于CSS交互的数据,.data()
和.prop()
可能适用。它们最大的优点是:它们可以保存任何Javascript值。
.prop()
最大的缺点是可能会出现名称冲突。只选择您确定永远不会用作本地属性的名称。例如,将scope
作为键是一个坏主意,因为它存在于某些HTML元素中...
现在是.data()
。其他答案似乎对此很有信心,但我避免使用它。与.prop()
和expando属性相关的内存泄漏已经成为过去,因此这不再是优势。但是,您将受到针对HTML属性名称冲突的保护。这是一个优点。但是您会遇到一堆缺点:
$(e).data('myKey')
会从 data-myKey
属性中获取未初始化的值(如果有),然后对其运行 JSON.parse(),有时返回该值,否则回退到属性的字符串值。一旦你设置了 $(e).data('myKey', myValue)
,你就失去了与 data-myKey
属性的关联,但该属性仍然保留其“旧”值,在 DOM 和 CSS 交互中显示。此外,你使用的键名可能会被重命名。也就是说,如果你决定通过 $(e).data()
读取所有键值,则该对象中的键可能不同。
由于这种 不稳定的行为(将 expando 属性技术与 data-*
属性混合使用)和不一致的 get/set 设计,我总是避免使用 .data()
。幸运的是,使用 .prop()
和 .attr()
(使用 data-*
键以符合规范)很容易做到。
如果您真的想使用
.data()
来避免与本地属性名称冲突,我的建议是:不要与
data-*
属性混合使用,将它们视为不同的东西,并避免与它们发生名称冲突。这样做有助于自动避免冲突,但需要手动避免其他地方的冲突。这是一个很好的设计。
$.data
引起的jQuery内存泄漏要简单得多。 - thorn0$.data
已经重新实现为使用直接数据附加。因此,当涉及到内存泄漏时,jQuery 2.2.4 和 3.x 都比它们的前身更安全了。https://github.com/jquery/jquery/issues/1734 - thorn0