使用jQuery的数据存储与expando属性(Using jQuery's datasto

2019-07-30 13:20发布

我使用jQuery开发代码,需要存储与特定的DOM元素相关的数据。 有大量关于如何存储任意数据与HTML元素的其他问题,但我更感兴趣的是,为什么我会选在另一个选项。

说,对于极度简化参数的缘故,我想存储与各行的“行号”属性的表中是“有趣”。

选项1是只设置每个DOM元素上的expando属性(我希望我使用术语“的expando”正确):

$('.interesting-line').each(function(i) { this.lineNumber = i; });

选项2是使用jQuery的data()函数的特性与元素相关联:

$('.interesting-line').each(function(i) { $(this).data('lineNumber', i); });

无视我的样本代码的任何其他缺陷,是否有充分的理由,为什么你会选择存储在其他属性的一种手段?

Answer 1:

如果您在创作一个插件,你应该使用$.data 。 如果您需要经常存储属性和很少需要查询DOM它然后使用$.data

说了这么多,因为我对存储自定义DOM的DOM元素本身属性上都倾向于我的客户端应用程序,这样我以后使用该属性可以查询他们[]选择:

var domElement = $('.interesting-line[lineNumber=' + lineNumber + ']').get(0);

这比迭代所述包裹组主叫更可读.data()上的每个项目。 通常我-oping间与如此有通过此机制快速方便地访问到DOM元素的DOM元素进行操作使得代码可读性另一个第三方库。

这是为存储查找表映射为容易lineNumbers到的元素,但是属性的expando技术不太有风险比较泄漏内存,因为你没有存储到你需要清理后的DOM元素的引用。

更新5年以后就阅读收到后[当之无愧] downvote:请忽略上面的删除线文本。 jQuery的查询基础上设置expando属性的DOM,并没有一会儿这样做。 因此,使用$.data 。 我们没有理由污染DOM时,有没有务实使用这样做。



Answer 2:

使用$.data会保护你的内存泄漏。

在IE中,当分配一个javascript对象到expando属性DOM元素上,跨越该链接周期是不垃圾收集。 如果您的JavaScript对象持有的DOM对象的引用,整个周期会泄漏。 这是完全可能的,以DOM对象隐藏引用,由于封锁,结束了,所以你可能没有意识到这一点泄漏。

jQuery的数据存储区被设置为防止这些循环的形成。 如果你使用它,你会不会以这种方式出现内存泄漏。 你的榜样不会泄漏,因为你的DOM元素上把原语(字符串)。 但是,如果你把一个更复杂的对象有,你就有可能泄漏。

使用$.data这样你就不必担心。



Answer 3:

使用$.data不会修改DOM。 您应该使用$.data 。 如果您要创建一个插件,那么你应该在一个对象存储$.data与对象的属性,而不是存储每个属性在不同的键/值对$.data结构。



文章来源: Using jQuery's datastore vs. expando properties