Нестандартные атрибуты HTML-тегов. Хорошая вещь? Плохо? Твои мысли?

92

HTML (или, может быть, просто XHTML?) Относительно строг, когда дело касается нестандартных атрибутов тегов. Если они не входят в спецификацию, ваш код считается несовместимым.

Однако нестандартные атрибуты могут быть весьма полезны для передачи метаданных в Javascript. Например, если ссылка должна показывать всплывающее окно, вы можете установить имя всплывающего окна в атрибуте:

<a href="#null" class="popup" title="See the Popup!" 
   popup_title="Title for My Popup">click me</a>

Кроме того, вы можете сохранить заголовок всплывающего окна в скрытом элементе, например в диапазоне:

<style>
    .popup .title { display: none; }
</style>
<a href="#null" title="See the Popup!" class="popup">
    click me
    <span class="title">Title for My Popup</span>
</a>

Тем не менее, я не уверен, какой метод предпочтительнее. Первый способ более лаконичен и, я полагаю, не так сильно портит поисковые системы и программы чтения с экрана. И наоборот, второй вариант упрощает хранение больших объемов данных и, следовательно, более универсален. Он также соответствует стандартам.

Мне любопытно, что думают эти сообщества. Как вы справляетесь с такой ситуацией? Перевешивает ли простота первого метода возможные недостатки (если они есть)?

Дэйв Манкофф
источник
3
Они называются атрибутами "expando" - если вы хотите узнать о них больше.
Джейсон Бантинг,
2
AFAIK, атрибуты expando устанавливаются во время выполнения с использованием javascript. Они не являются частью самого XHTML
Филипп Лейберт

Ответы:

50

Я большой поклонник предлагаемого решения HTML 5 ( data-префиксные атрибуты). Изменить: я бы добавил, что, вероятно, есть лучшие примеры использования настраиваемых атрибутов. Например, данные, которые будет использовать пользовательское приложение, не имеющие аналогов в стандартных атрибутах (например, настройка обработчиков событий на основе чего-то, что не обязательно может быть выражено в className или id).

без век
источник
2
Сейчас я склонен следовать этому решению - даже если оно не соответствует стандартам.
Том Риттер
1
Я всегда избегал этого, поскольку это не подтверждается. Но теперь, когда я думаю об этом, втиснуть все в атрибут class = "" (например, метаданные jquery) не обязательно лучше. Есть ли у этого метода практические недостатки в мире <HTML5? В принципе - какие проблемы возникнут сейчас? Похоже, это не идеально, но у меня нет побочных эффектов.
rocketmonkeys
@Rocketmonkeys Я не уверен, но я думаю, что использование данных внутри атрибута класса может заставить браузер попробовать применить неопределенные правила css к элементу, это может вызвать некоторые проблемы или проблемы с производительностью. Опять же, я не уверен.
Vitim.us
@ Vitim.us, если бы такое падение производительности было бы незначительным. Браузеры довольно эффективны в подобных вещах; попадание за фактическое применение стилей было бы больше. И помните, классы - это не что-то изобретенное для стилизации, это просто данные элемента, как и любой другой атрибут. В селекторе можно использовать любой атрибут, поэтому, если произойдет такое снижение производительности, он будет применяться буквально к любому атрибуту (включая data-префиксный), который вы добавляете к элементу.
век
@eyelidlessness - хороший аргумент, я должен согласиться, даже если я предпочитаю правильно использовать структуру данных внутри Javascript, я обнаружил несколько случаев, когда использование атрибута данных подходит. Я избегаю jquery, как сказал rocketmonkeys. Мне действительно нужно перестать беспокоить людей по поводу микрооптимизации.
Vitim.us
27

Настраиваемые атрибуты предоставляют удобный способ передачи дополнительных данных на сторону клиента. Dojo Toolkit делает это регулярно, и было указано ( Разоблачение мифов о Dojo Toolkit ), что:

Настраиваемые атрибуты всегда были допустимым HTML, они просто не проверяются при тестировании на DTD. [...] Спецификация HTML утверждает, что любой нераспознанный атрибут должен игнорироваться механизмом рендеринга HTML в пользовательских агентах, и Dojo может использовать это преимущество для облегчения разработки.

Мэн
источник
9

Другой вариант - определить что-то вроде этого в Javascript:

<script type="text/javascript">
var link_titles = {link1: "Title 1", link2: "Title 2"};
</script>

Затем вы можете использовать это позже в своем коде Javascript, если ваша ссылка имеет идентификатор, соответствующий идентификатору в этой хеш-таблице.

У него нет недостатков двух других методов: нет нестандартных атрибутов и уродливого скрытого диапазона.

Недостатком является то, что это может быть излишним для таких простых вещей, как ваш пример. Но для более сложных сценариев, когда вам нужно передать больше данных, это хороший выбор. Особенно учитывая, что данные передаются в формате JSON, поэтому вы можете легко передавать сложные объекты.

Кроме того, данные хранятся отдельно от форматирования, что способствует удобству обслуживания.

У вас даже может быть что-то вроде этого (чего нельзя сделать другими методами):

var poi_types = {1: "City", 2: "Restaurant"};
var poi = {1: {lat: X, lng: Y, name: "Beijing", type: 1}, 2: {lat: A, lng: B, name: "Hatsune", type: 2}};

...

<a id="poi-2" href="/poi/2/">Hatsune</a>

И поскольку вы, скорее всего, используете какой-то серверный язык программирования, эту хеш-таблицу должно быть тривиально для динамической генерации (просто сериализуйте ее в JSON и добавьте ее в раздел заголовка страницы).

ibz
источник
4

В этом случае оптимальным решением будет

<a href="#" alt="" title="Title of My Pop-up">click</a>

и используя атрибут title.

Иногда я нарушаю спецификацию, если мне это действительно нужно. Но редко и не зря.

РЕДАКТИРОВАТЬ: Не уверен, почему -1, но я указывал, что иногда вы думаете, что вам нужно нарушить спецификацию, когда вы этого не делаете.

Jskulski
источник
4

Почему бы не объявить атрибут popup_title в настраиваемом DTD? Это решает проблему с проверкой. Я делаю это со всеми нестандартными элементами, атрибутами и значениями и благодарю, что эта проверка показывает мне только реальные проблемы с моим кодом. Это также снижает вероятность ошибок браузера с таким HTML.

Шатер
источник
2

Вы можете вложить скрытые элементы ввода ВНУТРИ элемента привязки

<a id="anchor_id">
  <input type="hidden" class="articleid" value="5">
  Link text here
</a>

Затем вы можете легко извлечь данные,

$('#anchor_id .articleid').val()
Иоан Александру Куку
источник
1
Да, но лучший способ заключается в использовании: <input type="hidden" title="article_id" value="5" />. Поскольку класс - это что-то для CSS, фактически он дает недопустимый код, если класс отсутствует в информации о стиле. Даже если JS или CSS отключены, данные останутся скрытыми.
Yeti
1
@Yeti, класс не является чем-то для CSS и недействителен, если он не отображается в стилях. Это просто данные об элементе, как и любой другой атрибут. Связь с CSS заключается в том, что это хорошо поддерживаемый селектор.
век
0

В конце концов, я решил скрыть дополнительные данные в теге id, разделенные каким-то разделителем (одно подчеркивание - это пробел, два - конец этого аргумента), второй аргумент - это идентификатор:

<a href="#" class="article" id="Title_of_My_Pop-up__47">click</a>

Уродливо, и предполагается, что вы еще не используете тег id для чего-то еще, но он совместим во всех браузерах.

Мэтт Паркинс
источник
-1

Я лично считаю, что в вашем примере маршрут span более подходит, поскольку он соответствует стандартам спецификации XHTML. Однако я вижу аргумент для настраиваемых атрибутов, но я думаю, что они добавляют беспорядка, в котором нет необходимости.

Митчел Селлерс
источник
10
Однако маршрут SPAN - это неправильное использование тега. Он может соответствовать стандартам проверки, но не соответствует семантическим стандартам.
ceejayoz 04
-1

Я тоже ломал голову над этим. Мне нравится удобочитаемость нестандартных атрибутов, но мне не нравится, что это нарушает стандарты. Пример скрытого диапазона совместим, но не очень удобочитаем. Как насчет этого:

<a href="#" alt="" title="" rel="{popup_title:'Title of My Pop-up'}">click</a>

Здесь код очень удобочитаем благодаря нотации пары ключ / значение JSON. Вы можете сказать, что это метаданные, принадлежащие ссылке, просто взглянув на нее. Единственный недостаток, который я вижу помимо взлома атрибута "rel", заключается в том, что это приведет к беспорядку для сложных объектов. Мне очень нравится упомянутая выше идея атрибутов с префиксом "data-". Поддерживают ли это существующие браузеры?

Вот о чем еще нужно подумать. Насколько сильно несовместимый код влияет на SEO?


источник
7
Атрибут rel описывает отношения между текущей страницей и связанным ресурсом. Это не общий атрибут «Храните любые данные, которые вам нравятся». Так что это ужасно.
Квентин,
1
Поддерживают ли это существующие браузеры? - Что тут поддержать? Браузеры уже могут терпеть несовместимый код. Учитывая, что это часть нового HTML5, нечего бояться добавления атрибута data-, как если бы вы добавляли любой другой настраиваемый атрибут.
Slavic