Классы и ID имеют свои преимущества и недостатки (это также очень зависит от того, как вы их используете).
Классы — они были разработаны для передачи информации о стилях, но с появлением jQuery теперь они имеют двойное назначение, иногда обозначая действие (или данные), а иногда — стиль. Это довольно запутанно, особенно в крупномасштабных проектах. Представьте, что дизайнер пытается «рефакторить» CSS и меняет имена этих классов на элементах, к которым подключены javascript/jQuery — в результате возникают плохие вещи. Вы можете смягчить это префикс ваших имен классов без стиля с помощью «пространства имен», такого как «.donttouchthis-jqueryclass», который отличает логику от представления, является очень примитивным способом. Преимущество использования класса заключается в том, что его можно «складывать», поэтому он может передавать более сложную «логику», чем, например, идентификатор. С точки зрения чистого javascript (без jQuery) зависимость от классов в вашем коде приводит к некоторым проблемам обратной совместимости (getElementsByClassName).
Идентификаторы — как следует из названия, были разработаны для уникальной идентификации элементов. С точки зрения программирования идентификаторы предлагают самый быстрый способ доступа к элементам в модели DOM (getElementById). Их также можно стилизовать, однако вероятность удаления идентификатора при рефакторинге ниже (поскольку вы всегда можете удалить стиль идентификатора и присвоить ему класс). Идентификаторы уникальны, поэтому их широкое использование для хранения любых сложных данных очень и очень ограничено. Но они отлично подходят для связывания обработчиков кликов или уникальной идентификации фрагментов DOM, если вам нужен только один из идентифицированных ими элементов.
И у классов, и у идентификаторов есть одно важное правило, которое ограничивает их полезность в качестве средств для передачи любой бизнес-логики: они не могут начинаться с цифры (и часто вам просто нужен идентификатор базы данных, удобно назначенный элементу).
Пользовательские атрибуты (не data-) — они могут быть чем угодно, что угодно, но если вы заботитесь о «валидности» вашего HTML, вы будете ограничены определенными типами DTD, и вам нужно будет указать их в вашем DTD. На самом деле они не наносят вреда вашему HTML, поскольку браузеры специально обязаны (в соответствии с конвенцией W3C) игнорировать неизвестные атрибуты. Единственная проблема заключается в столкновении с потенциальными будущими разработками. Если вы используете чистый javascript, их также будет немного неудобно использовать (но это субъективный вариант - как было предложено в одном из ответов выше, это хороший дополнительный вариант для использования их в качестве хранилища данных). Вероятность путаницы при рефакторинге CSS невелика.
Пользовательские атрибуты данных — это замечательно, если вы используете jQuery, потому что вы можете хранить в нем действительно сложные данные (объекты и т. д.), при правильном использовании они действительно круты и дают вам хороший словарь для описания функций. ваших элементов DOM. Пространство имен «data-» хорошо защищает его от любых будущих конфликтов с атрибутами, не разделенными именами.
Сказав все, что лучшее решение состоит в том, чтобы не полагаться открыто ни на один из них, а реализовать шаблоны javascript, которые позволяют вам передавать родительский элемент DOM, а затем применять к нему функциональные возможности на основе разметки (например, стандартный шаблон плагина jQuery). Таким образом, вы удаляете множество зависимостей от определенных атрибутов/классов/идентификаторов, которые являются частью статического источника HTML.
person
Michal
schedule
13.12.2012
data-*
. Это недействительно, если вы просто придумываете свои собственные атрибуты - person ahren   schedule 13.12.2012