类和 ID 各有优缺点(这也很大程度上取决于您如何使用它们)。
课程- 它们旨在传达样式信息,但随着 jQuery 的出现,它们现在具有双重用途,有时表示动作(或数据),有时表示样式。这非常令人困惑,尤其是在大型项目中。想象一下,一个设计师试图“重构”CSS,并在连接了 javascript/jQuery 的元素上更改这些类名——坏事接踵而至。您可以使用“.donttouchthis-jqueryclass”之类的“名称空间”来减轻为非样式类名称添加前缀的情况,这将逻辑与表示区分开来是一种非常原始的方式。使用类的优点是它可以“堆叠”,因此它可以传达比 ID 更复杂的“逻辑”。
ID - 顾名思义,旨在唯一标识元素。从编程的角度来看,ID 提供了访问 DOM 中元素的最快方法 (getElementById)。它们也可以设置样式,但是在重构时删除 ID 的可能性较低(因为您始终可以删除 ID 样式并为其赋予一个类)。ID 是唯一的,因此广泛使用它们来存储任何复杂的数据是非常非常有限的。但是它们非常适合绑定单击处理程序或唯一标识 DOM 的块,只要您只需要它们标识的元素之一。
类和 ID 都有一个重要规则,限制了它们作为传达任何业务逻辑的手段的有用性——它们不能以数字开头(通常你只需要方便地将数据库 id 分配给一个元素)
自定义属性(不是数据)——它们可以是任何很酷的东西,但是如果您关心 HTML 的“有效性”,您将被限制为某些 DTD 类型,并且您需要在 DTD 中指定它们。实际上,它们不会损害您的 HTML,因为浏览器有义务(根据 W3C 约定)忽略未知属性。唯一的问题是与潜在的未来发展发生冲突。如果您使用的是纯 javascript,那么使用它们也会有点痛苦(但这是一个主观的选择——正如上面的答案之一所建议的那样,这是将它们用作数据存储的一个很好的补充选项)。重构 CSS 时发生混淆的可能性很小。
自定义数据属性- 如果您使用 jQuery,这些非常棒,因为您可以针对它存储非常复杂的数据(对象等),如果使用得当,它们真的很不错,并为您提供了一个很好的词汇表来描述您的 DOM 元素的功能。“data-”命名空间很好地保护它免受任何未来与非命名空间属性的冲突。
说了这么多,最好的解决方案不是公开依赖其中任何一个,而是实现 javascript 模式,允许您传递父 DOM 元素,然后基于标记向其应用功能(如标准 jQuery 插件模式)。通过这种方式,您可以消除对作为静态 HTML 源的一部分的特定属性/类/id 的大量依赖。