Нестандартні атрибути для тегів 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
Вони називаються атрибутами "експандо" - якщо ви хочете піти, дізнайтеся більше про них.
Джейсон Бантінг,

2
AFAIK, атрибути extendo встановлюються під час виконання за допомогою JavaScript. Вони не є частиною самого XHTML
Філіп Лейбарт,

Відповіді:


50

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


2
Я схильний дотримуватися цього рішення зараз - навіть якщо воно не відповідає стандартам.
Том Ріттер,

1
Я завжди уникав цього, оскільки це не підтверджує. Але тепер, коли я замислююся над цим, стискати все в атрибут class = "" (наприклад, метадані jquery) не обов'язково краще. Чи є якісь практичні недоліки цього методу в <HTML5 land? В основному - які проблеми зараз виникнуть? Здається, це не ідеально, але не має побічних ефектів, про які я можу подумати.
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 і сплюньте в розділі заголовка сторінки).


4

Ну в цьому випадку оптимальним рішенням є

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

та використовуючи атрибут title.

Іноді я розбиваю специфікацію, якщо мені це дійсно потрібно. Але рідко, і лише з поважних причин.

EDIT: Не впевнений, чому -1, але я вказував, що іноді ти думаєш, що потрібно зламати специфікацію, коли ні.


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

У вашому прикладі я особисто відчуваю, що пролітний маршрут є більш відповідним, оскільки він відповідає стандартам специфікації XHTML. Однак я бачу аргумент для користувацьких атрибутів, але я думаю, що вони додають рівень плутанини, який не потрібен.


10
Однак маршрут SPAN - це неправильне використання тегу. Він може відповідати стандартам перевірки, але не відповідає семантичним стандартам.
ceejayoz

-1

Я над цим також морочуся. Мені подобається читабельність нестандартних атрибутів, але мені не подобається, що це порушить стандарт. Приклад прихованого діапазону відповідає вимогам, але він не дуже читабельний. Як що до цього:

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

Тут код дуже читабельний через позначення пари ключ / значення JSON. Ви можете сказати, що це метадані, які належать за посиланням, просто подивившись на них. Єдиною вадою, яку я бачу поряд із викраденням атрибута "rel", є те, що це може стати брудним для складних об'єктів. Мені дуже подобається згадана вище ідея атрибутів з префіксом "data-". Чи підтримує це поточний браузер?

Тут є ще про що подумати. Наскільки вплив не відповідає сумісний код на SEO?


7
Атрибут rel описує взаємозв'язок між поточною сторінкою та пов'язаним ресурсом. Це не загальний атрибут "Зберігати будь-які дані, які вам подобаються". Тож це жахливо.
Квентін

1
Чи підтримує це поточний браузер? - Що є для підтримки? Браузери вже можуть терпіти невідповідний код. Враховуючи, що це частина нового HTML5, не потрібно боятися додавати атрибут data, як і будь-який інший спеціальний атрибут.
слов'янський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.