Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

使用 UUID 解决 DOM 节点数据存储问题

  最近又纠结了一个问题「如何安全地在 DOM 节点上存储数据」。也许有人会觉得这个问题很无聊,不就是存数据嘛,直接给 DOM 节点添加属性或使用 dataset 来存不就行了?其实我纠结点的并不是「存储」而是「安全地」,我要解决的问题是避免命名冲突。
  直接在 DOM 节点上添加属性的做法是很暴力的,这相当于在使用全局变量。因为 DOM 节点本身就是全局的东西,所以我们应该尽可能的避免直接在 DOM 节点上添加属性(这里说的「属性」直接涵盖了 property 和 attribute)。
  给 DOM 节点添加属性其实也并不是什么可怕的事情,jQuery 就会给 DOM 元素添加 attribute 来做唯一标识,React 更是丧心病狂。但是很显然,大家也不太愿意给 DOM 添加功能级的属性,因为功能级的属性可以有无穷多个,直接用的话就会有潜在的冲突问题。但如果只给元素添加一个唯一 ID,之后所有和这个元素相关的数据都通过这个唯一 ID 在元素之外的某个 map 上存储。由于这个 map 是私有的,那么就不会再出现功能级的属性冲突的情况。会出现的问题也只有唯一 ID 使用的名称冲突而已。
  绕了一大圈,不还是存在「唯一 ID 名」冲突的情况嘛?这确实也是个坑,但比起直接在 DOM 节点上存功能级的属性已经好得多了。至少「唯一 ID 名」即使冲突也没关系,只要它是一个「唯一 ID」即可,无论是谁提供的都无所谓。比如我使用 UUID 作为唯一 ID 名称,而 UUID 是一种有规范的东西(RFC 4122)。如果节点真有 UUID 这个属性,即使不是我的程序生成的也可能是其它程序已经提供好的 UUID,几乎不会有程序把 UUID 这个名称用于别的用途(即使有也是那个程序自己不规范)。那么,使用 UUID 作为节点的「唯一 ID 名」就非常安全。
  其实这个坑早就被规范填好了,只要 Map 或 WeakMap API 普及就再也不会有这么纠结的顾虑了。在目前它们没有普及的情况下,我觉得 UUID 应该是我能想到的最佳方案了。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^