Какой атрибут HTML лучше всего использовать для хранения информации для анализа jQuery?

Должен поддерживать IE6 и должен соответствовать требованиям XHTML Strict 1.0!

Это сложно объяснить ...

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

<a href="url.com" class="popup" rel="900x900" >My Link</a>

При этом jQuery будет искать все элементы, у которых есть всплывающее окно, анализировать значение rel для размеров всплывающего окна и запускать функцию popup () всякий раз, когда по этой ссылке щелкают с окном размером w = 900 h = 900

но мне нужно сделать еще один шаг, потому что я хочу иметь больше возможностей ...

<a href="url.com" class="popup" rel="900x900_scroll_tool_menu" >My Link</a>

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

Итак, я тоже думал об использовании классов для этого ... Я придумал следующее:

 <a href="url.com" class="popup opt_dim-900x900_scroll_tool_menu" >My Link</a>
 <img src="pic.gif" class="popup opt_dim-150x200_location" >My Link</a>

Судя по всему, параметры могут быть ОЧЕНЬ длинными, использование class кажется нормальным, но, возможно, есть что-то получше ...

Как вы думаете, какой способ лучше? У вас есть другая идея для этого? Я хочу сохранить параметры в каком-то атрибуте html.

Спасибо!

ОБНОВЛЕНИЕ

Мне постоянно напоминают, что есть дюжина способов сделать что-либо в Javascript, с точки зрения решений здесь я позже изменил правильный ответ на атрибут данных html5, который теперь, когда ie6 не является проблемой, кажется лучшим методом.

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


person qodeninja    schedule 09.03.2010    source источник
comment
api.jquery.com/jQuery.data   -  person jrummell    schedule 10.03.2010
comment
возможный дубликат нестандартных атрибутов на HTML-теги. Хорошая вещь? Плохо? Ваши мысли?   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 31.01.2014


Ответы (8)


Если вы можете использовать HTML5, используйте атрибуты data- * - они были разработаны именно для этой проблемы.

<div data-tool-menu="900x900">

http://ejohn.org/blog/html-5-data-attributes/

person Ian Clelland    schedule 09.03.2010
comment
не могу использовать html5, должен поддерживать ie6 - person qodeninja; 10.03.2010
comment
HTML 5 - это пока только черновик. - person Gumbo; 10.03.2010
comment
Это по-прежнему будет работать в IE6, пока вы не используете функцию javascript для доступа к нему, что еще нигде не реализовано, AFAIK. - person Rich Bradshaw; 10.03.2010
comment
«HTML 5 - это еще только черновик». За то, что громко кричал. Я почти уверен, что XMLHttpRequest не входил ни в одну спецификацию 5 лет назад, но тем не менее, мы, кажется, прекрасно ладили между собой. - person Paul D. Waite; 10.03.2010
comment
этот ответ бесполезен. Мне нужно поддерживать ie6, и разметка должна проверяться на соответствие xhtml strict. - person qodeninja; 10.03.2010
comment
@Marcel - именно поэтому я и задал этот вопрос, отлично! - person Paul D. Waite; 10.03.2010
comment
@codeninja - да, он не проверяется как XHMTL Strict (или Transitional). Но кроме class, в XHTML нет поддерживаемого IE способа добавления произвольных данных в теги HTML. Если бы вы могли переключиться на действительный HTML5 вместо действительного XHTML Strict, это было бы жизнеспособным вариантом. - person Paul D. Waite; 10.03.2010
comment
@codeninja: Или, если вы хотите придерживаться XHTML, вы можете переключиться на XHTML 5. Просто не используйте новые элементы, такие как <section> и <nav>, так как у вас могут возникнуть проблемы с ними, даже при использовании HTML5shiv. - person Marcel Korpel; 10.03.2010
comment
@Paul D. Waite: Откровенно говоря, XMLHTTP, предшественник XMLHTTPRequest, уже был в Internet Explorer 6. (Отсюда он и получил свое ужасное название.) - person Gumbo; 11.03.2010
comment
@ PaulD.Waite Оглядываясь назад на эту проблему и на то, что ie6 больше не поддерживается, использование атрибутов данных html5 кажется правильным решением! Забавно, как все меняется со временем. - person qodeninja; 21.09.2012
comment
@qodeninja: действительно, время в конечном итоге осуждает все браузеры. Хотя стоит помнить, что data-* атрибуты сами по себе всегда нормально работали в IE6, поэтому поддержка IE6 не была большой причиной, чтобы их избегать. - person Paul D. Waite; 23.09.2012

Почему бы просто не встроить json в атрибут rel:

<a href="url.com" class="popup" rel="{w:900,h:900}" >My Link</a>

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

если проверка вызывает беспокойство; вы всегда можете использовать xhtml, определить свое собственное пространство имен, а затем добавить настраиваемый атрибут.

<a href="url.com" class="popup" custom:options="{w:900,h:900}" >My Link</a>

Изменить: спасибо @andras в комментариях, вот отличный пример этой техники:
http://www.bennadel.com/blog/1453-Using-jQuery-With-Custom-XHTML-Attributes-And-Namespaces-To-Store-Data.htm

person Joel Martinez    schedule 09.03.2010
comment
Я тоже думал об этом, но я хочу, чтобы HTML выглядел как HTML без всякого Javascripty. Вы меня поняли? - person qodeninja; 10.03.2010
comment
Как указано в другом ответе, даже использование rel = для этого не будет подтверждено. Итак, теперь проблема заключается в том, что если я использую JSON, в какой атрибут HTML я его вставляю? - person qodeninja; 10.03.2010
comment
rel описывает текущий документ и документ, на который имеется ссылка. Не стоит злоупотреблять им для этого. - person Gumbo; 10.03.2010
comment
если проверка вызывает беспокойство; вы всегда можете использовать xhtml, определить свое собственное пространство имен, а затем добавить настраиваемый атрибут. ‹A href=url.com class=popup custom:options={w:900,h:900} ›Моя ссылка ‹/a› - person Joel Martinez; 10.03.2010
comment
@Joel: Кажется, неплохо (bennadel.com/blog/). - person Andras Vass; 10.03.2010
comment
@ Джоэл: вы думали об обновлении ответа? - person Andras Vass; 10.03.2010
comment
Можете ли вы использовать пользовательские пространства имен с XHTML в качестве text/html? Я думал, что это только XML. - person Paul D. Waite; 10.03.2010
comment
@Joel: ура, комментарий к настраиваемым атрибутам XHTML был действительно хорош. (... но @Gumbo прав: вы грешник, используя rel в своем ответе ... :-) codeoffsets.com? xD - person Andras Vass; 11.03.2010
comment
lol, честно говоря, явная проверка не всегда является требованием. В этих случаях rel (или любое другое значение атрибута) работает нормально ;-) - person Joel Martinez; 11.03.2010

Извлеките метаданные из элемента DOM и верните их как объект.

Вы можете поддерживать / использовать jQuery метаданные plugin. Есть несколько вариантов на выбор, и это хороший способ встроить метаданные в html.

например следующие все поддерживаются плагином.

<li class="someclass {some: 'data'} anotherclass">...</li>
<li data="{some:'random', json: 'data'}">...</li>
<li class="someclass">
   <script type="application/json">{some:"json",data:true}</script>...
</li>

См. Также: Шаблон разработки плагинов на сайте learningjquery.com

person Robert Paulson    schedule 10.03.2010
comment
это на самом деле то, к чему я склоняюсь. - person qodeninja; 14.03.2010
comment
В HTML5 есть также атрибуты *, специфичные для данных (и действительные!), Которые предназначены именно для такого рода вещей. Замените * всем, что вам нужно. Затем вы можете получить доступ к атрибуту и ​​загрузить его содержимое в javascript в любом необходимом формате, json является наиболее подходящим. - person arxpoetica; 27.06.2010
comment
@American Yak - Да, я все время использую атрибуты данных. Атрибуты данных HTML 5 - Джон Ресиг - person Robert Paulson; 27.06.2010

Вы можете включить элемент в элемент

Если вы присвоите элементу id, вы можете использовать что-то вроде:

<a href="/url" id="unique_id" class="popup">My Link
    <script type="text/javascript">
        popup['unique_id'] = { \\JSON object describing options
                             };
    </script>
</a>

Конечно, у вас все еще есть Javascript, связанный с вашим HTML, но он, по крайней мере, будет проверять.

person Dancrumb    schedule 09.03.2010
comment
хм или может быть скрытый диапазон опций? вложенный вяз - хорошая идея, но сценарий .. нет .. лол - person qodeninja; 10.03.2010
comment
SCRIPT имеет то преимущество, что он ничего не отображает, поэтому вам не нужно явно его скрывать. Я бы сказал, что это более уместно и семантически. - person Dancrumb; 10.03.2010
comment
Я стараюсь избегать встроенных скриптов для промывания мозгов. Я понимаю, что могут быть ситуации, когда встроенные скрипты имеют смысл, но это не одна из них. - person qodeninja; 21.09.2012
comment
Спустя два года я бы рекомендовал использовать атрибуты HTML 5 data- * для такого рода вещей. - person Dancrumb; 21.09.2012

Технически rel имеет ограниченный список возможных значений, поэтому вы можете создать страницу, которая не будет проверяться.

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

Обновление для комментариев:

Я стараюсь не перегружать одно имя класса, а создавать несколько классов, каждый из которых выполняет одну задачу. Это не только упрощает синтаксический анализ, но также упрощает отделение behavior от identity от attribute.

Например: код платформы Django Book не стал доступным (по крайней мере, то, что я могу найти где угодно, и я внимательно искал), поэтому я повторно реализую его для клиента (и, да, он будет выпущен OS ). Слегка измененная версия docutils автоматически добавляет behavior и identity к тегам «комментируемых элементов» при преобразовании из reStructuredText в HTML. Специфика неуместна, но существует множество классов типов cg-13-134 и cg-15-u-142, которые легки для глаз и парсера.

person Peter Rowell    schedule 09.03.2010
comment
Не могли бы вы подробнее рассказать, как вы используете классы для своих вариантов? вы делаете что-то вроде class = opt_location-1 opt_menu-0? - person qodeninja; 10.03.2010
comment
Тебе решать. Атрибут class просто дает вам место, где вы можете хранить столько произвольного строкового содержимого, сколько хотите (при условии, что они являются действительными именами классов HTML, я полагаю?) - person Paul D. Waite; 10.03.2010
comment
да, кое-что в этом (с использованием класса) мне не нравится = / - person qodeninja; 10.03.2010
comment
@codeninja: Хорошо, так где же вы поместить такую ​​информацию и при этом получить документ до HTML5, который будет проверяться? Насколько мне известно, единственное безопасное место для его размещения - class. Пока вы генерируете соответствующие имена классов, я не вижу проблемы. Любое имя, которое не определено в таблице стилей, является просто NOP. (en.wikipedia.org/wiki/NOP) - person Peter Rowell; 10.03.2010
comment
Очень интересный пример. У вас уже есть ссылка на этот проект или он еще не опубликован? - person Marcel Korpel; 11.03.2010
comment
@Marcel: На данный момент он закрыт для публики. Книга, для которой он используется, может быть поистине новаторской в ​​своей области, поэтому я в основном удостоверяюсь, что все необходимые функции доступны для избранной группы экспертов-рецензентов. Как только набор функций уляжется, я сделаю бета-версию, вероятно, примерно через 1-2 месяца. Отправьте мне электронное письмо, если вы хотите получить объявление. [email protected]. - person Peter Rowell; 11.03.2010
comment
@PeterRowell, вы все еще используете этот метод сейчас, когда атрибут данных в html делает многое из этого из коробки и семантически? - person qodeninja; 21.09.2012
comment
@qodeninja: да и да :-) Я использую data-whatever для фактических данных, но все же использую классы для определения элементов, которым нужно прикрепить JS-поведение. Я не тестировал это, но мне кажется, что селекторные движки большинства JS-фреймворков оптимизированы для поиска class больше, чем для произвольных имен / значений атрибутов. - person Peter Rowell; 22.09.2012

Я думаю, вы ищете jQuery.data ().

Метод jQuery.data () позволяет нам прикреплять данные любого типа к элементам DOM ...

Из примера по ссылке выше:

var div = $("div")[0];
jQuery.data(div, "test", { first: 16, last: "pizza!" });
$("span:first").text(jQuery.data(div, "test").first);
$("span:last").text(jQuery.data(div, "test").last);
person jrummell    schedule 09.03.2010
comment
Почему это должно быть в HTML? - person jrummell; 10.03.2010
comment
Вы правы, это не обязательно должен быть HTML, но это то, что я хотел в то время для этого решения. - person qodeninja; 21.09.2012

Почему бы не вместо этого:

<a href="url.com" class="popup">
<input type="hidden" value="900x900_scroll_tool_menu">My Link</a>

Затем просто используйте соответствующий селектор jQuery для события щелчка. Просто, и это позволяет исключить javascript из этой части вашего HTML.

person WVDominick    schedule 09.03.2010
comment
это нормально, кроме того факта, что ввод должен обрабатываться по форме для проверки. - person qodeninja; 10.03.2010
comment
@codeninja: Простите? Какой валидатор вы используете? input - это просто элемент встроенного уровня - вы можете поместить его в тег p, если хотите. (И, технически, вы не можете поместить его прямо в тег формы: они заключают в себе контент на уровне блоков; для этого и нужны наборы полей) - person Ian Clelland; 10.03.2010
comment
@IanClelland, если я помню, для того, чтобы разметка соответствовала типу документа XHTML, элемент ввода должен следовать за элементом формы. Когда я пытался использовать ввод без тега формы, у меня возникали ошибки проверки. Хотя он может быть встроенным, он семантически неверен. - person qodeninja; 21.09.2012

Поскольку вы собираетесь использовать javascript, я предлагаю добавить дополнительные параметры / информацию, которые вам нужны, в качестве параметров вашего URL-адреса. Я искал аналогичное решение вашего вопроса и наконец решил пойти по этому пути. Так же поступает и ThickBox (http://jquery.com/demo/thickbox/), и я успешно использовал его в нескольких проектах.

<a href="url.com?width=900&height=900&randomKey=randomValue" class="popup">My Link</a>

Тогда в вашем js

$(".popup").click(function(){
  var url = $(this).attr("href");
  var width = fancyFunctionToParseParameters(url, "width");
  ...
});
person sjobe    schedule 04.04.2012
comment
Это действительно умное использование URL! и на самом деле я сделал что-то очень похожее на это для автозагрузки модальных окон и всплывающих окон, когда определенные параметры были в строке URL - person qodeninja; 21.09.2012