Нестандартные атрибуты
При написании HTML мы используем много стандартных атрибутов. Но что насчёт нестандартных, пользовательских? Давайте посмотрим, полезны они или нет, и для чего они нужны.
Иногда нестандартные атрибуты используются для передачи пользовательских данных из HTML в JavaScript, или чтобы «помечать» HTML-элементы для JavaScript.
Как тут:
<!-- пометить div, чтобы показать здесь поле "name" -->
<div show-info="name"></div>
<!-- а здесь возраст "age" -->
<div show-info="age"></div>
<script>
// код находит элемент с пометкой и показывает запрошенную информацию
let user = {
name: "Pete",
age: 25
};
for(let div of document.querySelectorAll('[show-info]')) {
// вставить соответствующую информацию в поле
let field = div.getAttribute('show-info');
div.innerHTML = user[field]; // сначала Pete в name, потом 25 в age
}
</script>
Также они могут быть использованы, чтобы стилизовать элементы.
Например, здесь для состояния заказа используется атрибут order-state
:
<style>
/* стили зависят от пользовательского атрибута "order-state" */
.order[order-state="new"] {
color: green;
}
.order[order-state="pending"] {
color: blue;
}
.order[order-state="canceled"] {
color: red;
}
</style>
<div class="order" order-state="new">
A new order.
</div>
<div class="order" order-state="pending">
A pending order.
</div>
<div class="order" order-state="canceled">
A canceled order.
</div>
Почему атрибут может быть предпочтительнее таких классов, как .order-state-new
, .order-state-pending
, order-state-canceled
?
Это потому, что атрибутом удобнее управлять. Состояние может быть изменено достаточно просто:
// немного проще, чем удаление старого/добавление нового класса
div.setAttribute('order-state', 'canceled');
Но с пользовательскими атрибутами могут возникнуть проблемы. Что если мы используем нестандартный атрибут для наших целей, а позже он появится в стандарте и будет выполнять какую-то функцию? Язык HTML живой, он растёт, появляется больше атрибутов, чтобы удовлетворить потребности разработчиков. В этом случае могут возникнуть неожиданные эффекты.
Чтобы избежать конфликтов, существуют атрибуты вида data-*.
data- аттрибуты. dataset
Все атрибуты, начинающиеся с префикса «data-», зарезервированы для использования программистами. Они доступны в свойстве dataset
.
Например, если у elem
есть атрибут "data-about"
, то обратиться к нему можно как elem.dataset.about
.
Как тут:
<body data-about="Elephants">
<script>
alert(document.body.dataset.about); // Elephants
</script>
Атрибуты, состоящие из нескольких слов, к примеру data-order-state
, становятся свойствами, записанными с помощью верблюжьей нотации: dataset.orderState
.
Вот переписанный пример «состояния заказа»:
<style>
.order[data-order-state="new"] {
color: green;
}
.order[data-order-state="pending"] {
color: blue;
}
.order[data-order-state="canceled"] {
color: red;
}
</style>
<div id="order" class="order" data-order-state="new">
A new order.
</div>
<script>
// чтение
alert(order.dataset.orderState); // new
// изменение
order.dataset.orderState = "pending"; // (*)
</script>
Использование data-*
атрибутов – валидный, безопасный способ передачи пользовательских данных.
Пожалуйста, примите во внимание, что мы можем не только читать, но и изменять data-атрибуты. Тогда CSS обновит представление соответствующим образом: в примере выше последняя строка (*)
меняет цвет на синий.
Итого
- Атрибуты – это то, что написано в HTML.
- Свойства – это то, что находится в DOM-объектах.
Небольшое сравнение:
Свойства | Атрибуты | |
---|---|---|
Тип | Любое значение, стандартные свойства имеют типы, описанные в спецификации | Строка |
Имя | Имя регистрозависимо | Имя регистронезависимо |
Методы для работы с атрибутами:
elem.hasAttribute(name)
– проверить на наличие.elem.getAttribute(name)
– получить значение.elem.setAttribute(name, value)
– установить значение.elem.removeAttribute(name)
– удалить атрибут.elem.attributes
– это коллекция всех атрибутов.
В большинстве ситуаций предпочтительнее использовать DOM-свойства. Нужно использовать атрибуты только тогда, когда DOM-свойства не подходят, когда нужны именно атрибуты, например:
- Нужен нестандартный атрибут. Но если он начинается с
data-
, тогда нужно использоватьdataset
. - Мы хотим получить именно то значение, которое написано в HTML. Значение DOM-свойства может быть другим, например, свойство
href
– всегда полный URL, а нам может понадобиться получить «оригинальное» значение.
Практика
Получите атрибут
важность: 5
Напишите код для выбора элемента с атрибутом data-widget-name
из документа и прочитайте его значение.
<!DOCTYPE html>
<html>
<body>
<div data-widget-name="menu">Choose the genre</div>
<script>
/* your code */
</script>
</body>
</html>
Сделайте внешние ссылки оранжевыми
важность: 3
Сделайте все внешние ссылки оранжевыми, изменяя их свойство style
.
Ссылка является внешней, если:
- Её
href
содержит://
- Но не начинается с
http://internal.com
.
Пример:
<a name="list">the list</a>
<ul>
<li><a href="http://google.com">http://google.com</a></li>
<li><a href="/tutorial">/tutorial.html</a></li>
<li><a href="local/path">local/path</a></li>
<li><a href="ftp://ftp.com/my.zip">ftp://ftp.com/my.zip</a></li>
<li><a href="http://nodejs.org">http://nodejs.org</a></li>
<li><a href="http://internal.com/test">http://internal.com/test</a></li>
</ul>
<script>
// добавление стиля для одной ссылки
let link = document.querySelector('a');
link.style.color = 'orange';
</script>