Від автора: у цій статті я покажу вам, як використовувати HTML5 data-атрибути. Також я розповім вам, де їх можна застосувати в реальній роботі.
Чому саме користувальницькі data-атрибути?
Дуже часто нам доводиться зберігати інформацію, пов’язану з різними DOM-елементами. Для користувачів ця інформація може бути несуттєвою, проте простий доступ до неї сильно спростить життя для нас з вами, розробників.
Наприклад, у вас на сторінці показано список ресторанів. До HTML5 для зберігання інформації про їжу в ресторані, а також про відстані до нього від відвідувача ви могли скористатися атрибутом class. А що якщо вам також потрібно зберігати id ресторану, щоб знати, в який конкретний ресторан користувач збирається піти?
З підходом на HTML-класах пов’язано кілька проблем:
атрибут class не призначений для зберігання такої інформації, його основне завдання – дозволяти розробнику призначати стилі на набір елементів;
кожен новий шматок інформації потребує додавання окремого класу, що ускладнює парсинг даних в JS;
скажімо, якийсь клас починається з чисел. Якщо пізніше ви захочете стилізувати елементи з допомогою такого класу, то вам доведеться або відмовитися від чисел, або використовувати селектори атрибутів.
Щоб позбутися від цих проблем, в HTML5 були представлені користувальницькі data-атрибути. Всі атрибути на елементі, що починаються на data – є data-атрибутами. З їх допомогою також можна стилізувати елементи.
Тепер давайте вивчимо основи data-атрибутів і дізнаємося, як отримати їх значення в CSS і JS.
Синтаксис HTML
Як я вже згадував раніше, data-атрибути починаються на data-. Приклад:
Тепер ці data-атрибути можна використовувати для пошуку і сортування ресторанів для відвідувачів. Наприклад, можна відобразити тільки вегетаріанські ресторани в певному радіусі.
Крім префікса data – в іменах користувальницьких data-атрибутів можуть зустрічатися літери, цифри, тире (-), крапка (.), двокрапка (:) і нижнє підкреслення (_). Заголовних букв в імені бути не повинно.
При використанні data-атрибутів необхідно пам’ятати про дві речі.
Перше, тип зберігаються в атрибуті даних повинен бути string (рядок). Також в data-атрибуті можуть зберігатися будь-які дані, які можна перекодувати в рядок. Перетворення типів повинні виконуватися в JS.
Друге, data-атрибути необхідно використовувати тільки в крайньому випадку, якщо жоден інший HTML-елемент або атрибут не підходить. Наприклад, не можна зберігати клас елемента в атрибуті data-class.
У одного елемента може бути скільки завгодно багато data-атрибутів із самими різними значеннями.
Data-атрибути CSS
Data-атрибути CSS можна використовувати для стилізації елементів з допомогою селекторів атрибутів. Також за допомогою функції attr() можна показувати користувачам інформацію з data-атрибутів (з допомогою зринаючі підказки, наприклад).
Стилізація елементів
Повертаємося до нашого прикладу з ресторанами. Ви можете дати підказку користувачам про тип ресторану або відстані до нього з допомогою селекторів атрибутів. З їх допомогою можна задати різні фони ресторанам, приклад:
li[data type=’veg’] {
background: #8BC34A;
}
li[data type=’french’] {
background: #3F51B5;
}
Створення тултипов
З допомогою тултипов користувачам можна показувати додаткову інформацію про елемент.
Рекомендую використовувати цей метод для швидких прототипів, а не в продакшені, так як зринаючі підказки. на чистому CSS не повністю доступні.
Інформацію, яку ви хочете показати, можна зберігати в атрибуті data-tooltip.
Word
Представити дані користувача можна за допомогою псевдоэлемента ::before.
span::before {
content: attr(data-tooltip);
// Інші стилі
}
span:hover::before {
display: inline-block;
}
Отримання доступу до data-атрибутів в JS
Існує 3 способи отримати доступ до data-атрибутів в JS.
Методи getAttribute і setAttribute
За допомогою методів getAttribute() і setAttribute() в JS можна отримувати та встановлювати значення data-атрибутів.
Метод getAttribute поверне null або порожній рядок, якщо атрибут не існує. Приклад використання методів:
var restaurant = document.getElementById(“restaurantId”);
var ratings = restaurant.getAttribute(“data-ratings”);
За допомогою методу setAttribute можна змінювати існуючі значення, а також додавати нові атрибути.
restaurant.setAttribute(“data-owner-name”, “someName”);
Властивість dataset
Більш простий спосіб отримати доступ до data-атрибутах – з допомогою властивості dataset. Це властивість повертає об’єкт DOMStringMap з одним записом для кожного data-атрибуту.
При використанні властивості dataset необхідно пам’ятати про декілька речей.
Трансформація користувальницького data-атрибута ключ DOMStringMap проходить в три етапи:
з імені атрибута видаляється префікс data;
будь дефіс, за яким слідує буква нижнього регістра, видаляється з імені, а наступна за нею буква переводиться у верхній регістр;
інші символи не змінюються. Всі тире, після яких не йде літера в нижньому регістрі, також залишаються.
Отримати доступ до атрибутів можна за допомогою імені в верблюжьем регістрі, яке зберігається в об’єкті у вигляді ключа. Наприклад, ось так: element.dataset.keyname.
Інший спосіб отримати доступ до атрибутів – використовувати квадратні дужки, ось так: element.dataset[keyname].
Розберемо наступний HTML-код:
Пара прикладів:
var restaurant = document.getElementById(“restaurantId”);
var ratings = restaurant.dataset.ratings;
restaurant.dataset.ratings = newRating;
var owner = restaurant.dataset[‘ownerName’];
restaurant.dataset[‘ownerName’] = ‘newOwner’;
Цей метод в даний час підтримується у всіх основних браузерах, використовуйте його для доступу до користувальницьким data-атрибутами, а не попередній спосіб.
За допомогою jQuery
Також отримати доступ до data-атрибутів можна через jQuery-метод data(). До jQuery 1,6 для доступу до data-атрибутів необхідно було писати наступний код:
var restaurant = $(“#restaurantId”);
var owner = restaurant.data(“owner-name”);
restaurant.data(“owner-name”, “newName”);
З версії 1,6 jQuery перейшов на верблюжий регістр в data-атрибутах. Тепер код зверху можна переписати наступним чином:
var restaurant = $(“#restaurantId”);
var owner = restaurant.data(“ownerName”);
restaurant.data(“ownerName”, “newName”);
Також ви повинні знати, що jQuery самостійно намагається конвертувати рядок, отриману з data-атрибута відповідний тип. Наприклад, числовий, Булев, об’єкт, масив або null.
var restaurant = $(“#restaurantId”);
var identifier = restaurant.data(“identifier”);
console.log(typeof identifier);
// number
Якщо необхідно отримати значення атрибута у вигляді рядка, і щоб jQuery не пробував його конвертувати в інший тип, скористайтесь jQuery-методом attr().
jQuery витягує значення data-атрибутів тільки один раз при першому доступі. Потім data-атрибути не доступні і не змінюються. Усі внесені в атрибути зміни застосовуються тільки в рамках jQuery і доступні тільки в ньому.
Наприклад, вам потрібно щось змінити в data-атрибутах наступного елемента списку:
Для зміни атрибута data-distance можна використовувати наступний код:
var distance = $(“#salad”).data(“distance”);
console.log(distance);
// “2miles”
$(“#salad”).data(“distance”,”1.5 miles”);
console.log(distance);
// “1.5 miles”
document.getElementById(“салат”).dataset.distance;
// “2miles”
Як бачите, при отриманні значення атрибута data-distance з допомогою звичайного JS (не jQuery) відображається старе значення.
Висновок
У цьому уроці я розповів усе, що потрібно знати про HTML5 data-атрибутах. Крім створення тултипов і стилізації елементів з допомогою селекторів атрибутів data-атрибути можна використовувати для зберігання і відображення користувачам інших даних. Наприклад, повідомлення про непрочитані повідомлення і т. д.