Функция attr()


Содержание

Функция attr()

Функция attr() используется чтобы вернуть значение атрибута HTML элемента для использования в таблицах стилей CSS в качестве значения свойства.

attr()
Поддержка браузерами: IE 8+, Chrome 2+, Opera 9+, Safari 3.1+, Firefox 1+, Android 2.1+
Версия CSS: CSS 2.1, CSS3
Примечание:

Синтаксис

CSS2.1

где attribute-name — имя атрибута элемента HTML.
Возвращаемое значение является строкой.
В спецификации CSS2.1 функция attr() может использоваться только со свойством content .

CSS3

где attribute-name — имя атрибута элемента HTML.
Значение может быть любым свойством CSS.
Значение должно быть действительным значением CSS для свойства к которому применяется attr().
В спецификации CSS3 возвращаемое значение может быть любым действительным значением CSS.
Функция attr() может быть использована с любым CSS свойством.

Функция attr()

Функция attr() (аббревиатура от «attribute») — это функция, которая возвращает значение переданного атрибута элемента в виде строки.

Общие сведения

Например, attr(X) возвращает значение атрибута X указанного в элементе. Если у элемента нет атрибута X , то вернётся пустая строка. Для примера, у ссылок есть атрибут href , который определяет местоположение на которое указывает ссылка. С помощью свойства content и функции attr() вы можете получить значение URL указанное в атрибуте href , что довольно эффективно. Это можно использовать в стилях для печатной версии страницы, чтобы вывести URL-адрес страницы на которую указывает ссылка, сразу за её содержимым (с помощью псевдоэлемента ::after). Например:

В примере выше CSS правило выбирает все ссылки с атрибутом href (с помощью селекторов атрибутов), извлекает значение атрибута href с помощью функции attr() , а затем использует его в качестве контента для псевдоэлемента ::after, который добавляет полученное значение к ссылкам.

Функция attr() может получать значения из любых атрибутов элемента, включая кастомные data-атрибуты из HTML5. Например:

Поддержка браузерами

attr() поддерживается всеми основными браузерами: Chrome, Firefox, Safari, Opera, IE, и на Android и на iOS.

Пример

Ниже показан пример использования функции attr() :

Получение или изменение значения атрибутов выбранных элементов

.attr() — возвращает или изменяет значение атрибутов у выбранных элементов страницы.

Функция имеет четыре варианта использования:

Возвращает значение атрибута attrName у выбранного элемента. Если выбрано несколько элементов, то значение будет взято у первого.

  • attributeName — имя атрибута.

Устанавливает атрибуту attrName значение value , у всех выбранных элементов.

  • attributeName — имя атрибута;
  • value — значение, присеваемое атрибуту.

Устанавливает значения атрибутов, полученные в виде пар ключ:’значение’ объекта attributes.

Присваивает атрибуту attributeName значение, возвращенное функцией function() для всех элементов набора jQuery

  • attributeName — имя атрибута;
  • function (index, attr) — функция, которая вызывается индивидуально для каждого отдельного элемента в наборе, а возвращаемое ею значение становится значением атрибута
    • index — позиция элемента в наборе;
    • attr — текущее значение атрибута attributeName у элемента.

Замечание 1: используя метод .attr(name) , вы получите значения атрибута только первого элемента из всех выбранных. Если вам нужны значения всех элементов, то следует использовать конструкции типа .map() или .each() .

.attr() или .prop()

В определенных ситуациях разница между .attr() и .prop() существенна. До jQuery 1.6 .attr() содержал множество багов и был непрост в поддержке. Начиная с jQuery 1.6 метод .prop() предназначен для работы со свойствами DOM-объектов, в то время как .attr() — для работы с атрибутами.

Например, selectedIndex , tagName , nodeName , nodeType , ownerDocument , defaultChecked , и defaultSelected должны быть получены или изменятся функцией .prop()


Начиная с jQuery 1.6, метод .attr() возвращает undefined для тех атрибутов, значение которых не было задано. Для получения и выставления таких опций как checked , selected , или disabled используйте метод .prop()

Допустим у нас есть элемент , а в переменной elem хранится его DOM-объект. В этом случае разница при работе с атрибутами и свойствами существенна, т.к. идет речь об атрибутах не требующих указания значений (checked и disabled в input-элементах). Сравним результаты:

  • elem.checked — возвращает true
  • $( elem ).prop( «checked» ) — возвращает true
  • elem.getAttribute( «checked» ) — возвращает пустую строку
  • $( elem ).attr( «checked» ) — начиная с jQuery 1.6 возвращает пустую строку и true для более ранних версий

Кросс-браузерный способ определить, установлен ли флажок:

Работа с атрибутами

Материал из JQuery

$(«div»).attr(«class») вернет имя класса у первого div-элемента на странице
$(«div»).attr(«class», «divEl») класс всех div-элементов на странице станет равным divEl
$(«div»).attr(<"class":"divEl", "title":"Див">) класс div-элементов станет равен divEl, а title — «Див»
$(«.rool»).attr(«title») вернет подсказку элемента с классом rool. Если таких элементов на странице несколько — вернет первого из них.

Замечание 1: важно отметить, что используя метод .attr(name), вы получите значения атрибута только первого элемента из всех выбранных. Если вам нужны значения всех элементов, то следует использовать конструкции типа .map() или .each().

Замечание 2: IE не позволяет менять атрибут type у элементов input и button.

Изменения в jQuery-1.6

Начиная с версии jQuery-1.6, при попытке получить значение атрибута, которым элемент не обладает, метод attr(attrName) вернет undefined. В более ранних версиях, вместо этого, в некоторых случаях, возвращалась пустая строка. Кроме того, начиная с версии jQuery-1.6 в jQuery разделены способы работы с атрибутами и свойствами DOM-объектов (разница между атрибутами и свойствами) и для последних стоит использовать prop(propName). В частности, разница при работе с атрибутами и свойствами существенна, когда идет речь об атрибутах не требующих указания значений (checked и disabled в input-элементах): допустим у нас есть элемент , а в переменной elem хранится его DOM-объект. В этом случае, работа со значением checked будет иметь следующие результаты:

elem.checked true
$(elem).prop(«checked») true
elem.getAttribute(«checked») пустая строка.
$(elem).attr(«checked») пустая строка для jQuery-1.6+ и true для более ранних версий.

В действии

найдем элемент с идентификатором newsBlock и поместим в него, значение его же класса:

Атрибуты и DOM-свойства

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/dom-attributes-and-properties.

При чтении HTML браузер генерирует DOM-модель. При этом большинство стандартных HTML-атрибутов становятся свойствами соответствующих объектов.

Например, если тег выглядит как , то у объекта будет свойство body. .

Но это преобразование – не один-в-один. Бывают ситуации, когда атрибут имеет одно значение, а свойство – другое. Бывает и так, что атрибут есть, а свойства с таким названием не создаётся.

Если коротко – HTML-атрибуты и DOM-свойства обычно, но не всегда соответствуют друг другу, нужно понимать, что такое свойство и что такое атрибут, чтобы работать с ними правильно.

Свои DOM-свойства

Ранее мы видели некоторые встроенные свойства DOM-узлов. Но, технически, никто нас ими не ограничивает.

Узел DOM – это объект, поэтому, как и любой объект в JavaScript, он может содержать пользовательские свойства и методы.

Например, создадим в document.body новое свойство и запишем в него объект:

Можно добавить и новую функцию:

Нестандартные свойства и методы видны только в JavaScript и никак не влияют на отображение соответствующего тега.

Обратим внимание, пользовательские DOM-свойства:

  • Могут иметь любое значение.
  • Названия свойств чувствительны к регистру.
  • Работают за счёт того, что DOM-узлы являются объектами JavaScript.

Атрибуты

Элементам DOM, с другой стороны, соответствуют HTML-теги, у которых есть текстовые атрибуты.

Конечно, здесь речь именно об узлах-элементах, не о текстовых узлах или комментариях.

Доступ к атрибутам осуществляется при помощи стандартных методов:

  • elem.hasAttribute(name) – проверяет наличие атрибута
  • elem.getAttribute(name) – получает значение атрибута
  • elem.setAttribute(name, value) – устанавливает атрибут
  • elem.removeAttribute(name) – удаляет атрибут


Эти методы работают со значением, которое находится в HTML.

Также все атрибуты элемента можно получить с помощью свойства elem.attributes , которое содержит псевдо-массив объектов типа Attr.

В отличие от свойств, атрибуты:

  • Всегда являются строками.
  • Их имя нечувствительно к регистру (ведь это HTML)
  • Видны в innerHTML (за исключением старых IE)

Рассмотрим отличия между DOM-свойствами и атрибутами на примере HTML-кода:

Пример ниже устанавливает атрибуты и демонстрирует их особенности.

При запуске кода выше обратите внимание:

  1. getAttribute(‘About’) – первая буква имени атрибута About написана в верхнем регистре, а в HTML – в нижнем, но это не имеет значения, так как имена нечувствительны к регистру.
  2. Мы можем записать в атрибут любое значение, но оно будет превращено в строку. Объекты также будут автоматически преобразованы.
  3. После добавления атрибута его можно увидеть в innerHTML элемента.
  4. Коллекция attributes содержит все атрибуты в виде объектов со свойствами name и value .

Когда полезен доступ к атрибутам?

Когда браузер читает HTML и создаёт DOM-модель, то он создаёт свойства для всех стандартных атрибутов.

Например, свойства тега ‘A’ описаны в спецификации DOM: HTMLAnchorElement.

Например, у него есть свойство «href» . Кроме того, он имеет «id» и другие свойства, общие для всех элементов, которые описаны в спецификации в HTMLElement.

Все стандартные свойства DOM синхронизируются с атрибутами, однако не всегда такая синхронизация происходит 1-в-1, поэтому иногда нам нужно значение именно из HTML, то есть атрибут.

Рассмотрим несколько примеров.

Ссылка «как есть» из атрибута href

Синхронизация не гарантирует одинакового значения в атрибуте и свойстве.

Для примера, посмотрим, что произойдёт с атрибутом «href» при изменении свойства:

Это происходит потому, что атрибут может быть любым, а свойство href , в соответствии со спецификацией W3C, должно быть полной ссылкой.

Стало быть, если мы хотим именно то, что в HTML, то нужно обращаться через атрибут.

Кстати, есть и другие атрибуты, которые не копируются в точности. Например, DOM-свойство input.checked имеет логическое значение true/false , а HTML-атрибут checked – любое строковое, важно лишь его наличие.

Работа с checked через атрибут и свойство:

Исходное значение value

Изменение некоторых свойств обновляет атрибут. Но это скорее исключение, чем правило.

Чаще синхронизация – односторонняя: свойство зависит от атрибута, но не наоборот.

Например, при изменении свойства input.value атрибут input.getAttribute(‘value’) не меняется:

То есть, изменение DOM-свойства value на атрибут не влияет, он остаётся таким же.

А вот изменение атрибута обновляет свойство:

Эту особенность можно красиво использовать.

Получается, что атрибут input.getAttribute(‘value’) хранит оригинальное (исходное) значение даже после того, как пользователь заполнил поле и свойство изменилось.

Например, можно взять изначальное значение из атрибута и сравнить со свойством, чтобы узнать, изменилось ли значение. А при необходимости и перезаписать свойство атрибутом, отменив изменения.

Классы в виде строки: className

Атрибуту «class» соответствует свойство className .

Так как слово «class» является зарезервированным словом в JavaScript, то при проектировании DOM решили, что соответствующее свойство будет называться className .

Кстати, есть и другие атрибуты, которые называются иначе, чем свойство. Например, атрибуту for ( ) соответствует свойство с названием htmlFor .

Классы в виде объекта: classList


Атрибут class – уникален. Ему соответствует аж целых два свойства!

Работать с классами как со строкой неудобно. Поэтому, кроме className , в современных браузерах есть свойство classList .

Свойство classList – это объект для работы с классами.

Оно поддерживается в IE начиная с IE10, но его можно эмулировать в IE8+, подключив мини-библиотеку classList.js.

  • elem.classList.contains(«class») – возвращает true/false , в зависимости от того, есть ли у элемента класс class .
  • elem.classList.add/remove(«class») – добавляет/удаляет класс class
  • elem.classList.toggle(«class») – если класса class нет, добавляет его, если есть – удаляет.

Кроме того, можно перебрать классы через for , так как classList – это псевдо-массив.

Нестандартные атрибуты

У каждого элемента есть некоторый набор стандартных свойств, например для это будут href , name , а для это будут src , alt , и так далее.

Точный набор свойств описан в стандарте, обычно мы более-менее представляем, если пользуемся HTML, какие свойства могут быть, а какие – нет.

Для нестандартных атрибутов DOM-свойство не создаётся.

Свойство является стандартным, только если оно описано в стандарте именно для этого элемента.

То есть, если назначить элементу атрибут href , то свойство img.href от этого не появится. Как, впрочем, и если назначить ссылке атрибут alt :

Нестандартные атрибуты иногда используют для CSS.

В примере ниже для показа «состояния заказа» используется атрибут order-state :

Почему именно атрибут? Разве нельзя было сделать классы .order-state-new , .order-state-pending , order-state-canceled ?

Конечно можно, но манипулировать атрибутом из JavaScript гораздо проще.

Например, если нужно отменить заказ, неважно в каком он состоянии сейчас – это сделает код:

Для классов – нужно знать, какой класс у заказа сейчас. И тогда мы можем снять старый класс, и поставить новый:

…То есть, требуется больше исходной информации и надо написать больше букв. Это менее удобно.

Проще говоря, значение атрибута – произвольная строка, значение класса – это «есть» или «нет», поэтому естественно, что атрибуты «мощнее» и бывают удобнее классов как в JS так и в CSS.

Свойство dataset, data-атрибуты

С помощью нестандартных атрибутов можно привязать к элементу данные, которые будут доступны в JavaScript.

Как правило, это делается при помощи атрибутов с названиями, начинающимися на data- , например:

Стандарт HTML5 специально разрешает атрибуты data-* и резервирует их для пользовательских данных.

При этом во всех браузерах, кроме IE10-, к таким атрибутам можно обратиться не только как к атрибутам, но и как к свойствам, при помощи специального свойства dataset :

Обратим внимание – название data-user-location трансформировалось в dataset.userLocation . Дефис превращается в большую букву.

Полифил для атрибута hidden

Для старых браузеров современные атрибуты иногда нуждаются в полифиле. Как правило, такой полифил включает в себя не только JavaScript, но и CSS.

Этот атрибут должен прятать элемент, действие весьма простое, для его поддержки в HTML достаточно такого CSS:

Если запустить в IE11- пример выше, то

Это потому что CSS «не видит» присвоенное свойство, нужно синхронизировать его в атрибут.

Вот так – уже работает:

«Особенности» IE8

Если вам нужна поддержка этих версий IE – есть пара нюансов.

Во-первых, версии IE8- синхронизируют все свойства и атрибуты, а не только стандартные:

При этом даже тип данных не меняется. Атрибут не становится строкой, как ему положено.


Ещё одна некорректность IE8-: для изменения класса нужно использовать именно свойство className , вызов setAttribute(‘class’, . ) не сработает.

Вывод из этого довольно прост – чтобы не иметь проблем в IE8, нужно использовать всегда только свойства, кроме тех ситуаций, когда нужны именно атрибуты. Впрочем, это в любом случае хорошая практика.

Итого

  • Атрибуты – это то, что написано в HTML.
  • Свойство – это то, что находится внутри DOM-объекта.

Таблица сравнений для атрибутов и свойств:

Свойства Атрибуты
Любое значение Строка
Названия регистрозависимы Не чувствительны к регистру
Не видны в innerHTML Видны в innerHTML

Синхронизация между атрибутами и свойствами:

  • Стандартные свойства и атрибуты синхронизируются: установка атрибута автоматически ставит свойство DOM. Некоторые свойства синхронизируются в обе стороны.
  • Бывает так, что свойство не совсем соответствует атрибуту. Например, «логические» свойства вроде checked , selected всегда имеют значение true/false , а в атрибут можно записать произвольную строку.Выше мы видели другие примеры на эту тему, например href .
  • Нестандартный атрибут (если забыть глюки старых IE) никогда не попадёт в свойство, так что для кросс-браузерного доступа к нему нужно обязательно использовать getAttribute .
  • Атрибуты, название которых начинается с data- , можно прочитать через dataset . Эта возможность не поддерживается IE10-.

Для того, чтобы избежать проблем со старыми IE, а также для более короткого и понятного кода старайтесь везде использовать свойства, а атрибуты – только там, где это действительно нужно.

А действительно нужны атрибуты очень редко – лишь в следующих трёх случаях:

  1. Когда нужно кросс-браузерно получить нестандартный HTML-атрибут.
  2. Когда нужно получить «оригинальное значение» стандартного HTML-атрибута, например, .
  3. Когда нужно получить список всех атрибутов, включая пользовательские. Для этого используется коллекция attributes .

Если вы хотите использовать собственные атрибуты в HTML, то помните, что атрибуты с именем, начинающимся на data- валидны в HTML5 и современные браузеры поддерживают доступ к ним через свойство dataset .

Задачи

Поставьте класс ссылкам

Сделайте жёлтыми внешние ссылки, добавив им класс external .

8 хитрых приёмов, реализуемых с помощью одного лишь CSS

CSS может гораздо больше, чем вы от него ожидаете. С каждым годом этот язык становится всё мощнее, получая функционал, который раньше был только у JavaScript. В этой статье мы рассмотрим 8 хитрых трюков с CSS-функциями, для которых не нужен JS.

1. Подсказки (tooltips)

Многие сайты до сих пор используют JavaScript для создания подсказок, но самом деле на CSS их сделать гораздо проще. Самым лёгким решением будет прописать текст подсказки в data-атрибуте HTML-кода, например, data-tooltip=»…» . Теперь можно использовать CSS для отображения текста подсказки в функции attr() :

Всё предельно просто. Конечно, для стилизации нужно больше кода, но, к счастью, для этого есть прекрасная библиотека Hint.css.

2. Использование data-атрибутов и функции attr()

Мы уже использовали attr() для подсказок, но это не единственный способ её применения. В сочетании с data-атрибутами вы можете создать изображение-ярлык с заголовком и описанием, используя лишь одну строку HTML-кода:

Теперь вы можете использовать функцию attr() для отображения заголовка и описания:

Вот рабочий пример с анимацией, срабатывающей при наведении:

3. CSS-счётчики

То, что можно делать с CSS-счётчиками, похоже на магию. Это не самая известная функция языка, и многие считают, что она почти не поддерживается, но это не так:

See Can I Use css-counters? Data on support for the css-counters feature across the major browsers from caniuse.com.

Счётчики не стоит использовать для списков (

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

CSS-счётчики также прекрасно подходят для отображения динамически изменяющихся чисел в списках, которые можно пересортировать перетаскиванием:

4. Эффект “замерзшего стекла” при помощи CSS-фильтров


Ещё в iOS 7 Apple добавила эффект “замерзшего стекла” — полупрозрачные, размытые элементы. Этот эффект становится весьма популярным. Реализовать его раньше было не так уж и просто — до того, как появились CSS-фильтры, изображения приходилось искажать. Теперь же всё стало намного легче.

See Can I Use css-filters? Data on support for the css-filters feature across the major browsers from caniuse.com.

12–13 ноября, Санкт-Петербург, беcплатно

В будущем будет возможно создавать похожие эффекты при помощи свойства backdrop-filter и функции filter() , которые пока что поддерживаются только Safari.

5. Используем HTML-элементы в качестве фона

Обычно в качестве фона вы используете JPEG- или PNG-файл или градиент. Знали ли вы, что при помощи функции element() вы можете использовать

See Can I Use css-element-function? Data on support for the css-element-function feature across the major browsers from caniuse.com.

Возможности почти безграничны, что демонстрирует пример с MDN.

6. Улучшенная сетка при помощи calc()

Гибкие сетки — это очень полезная штука, но при работе с ними возникают различные проблемы, связанные в основном с разметкой и размерами блоков. Даже flexbox не справится с этой задачей в одиночку. Но функция calc() , которую можно использовать в качестве значения, может принести много пользы. В этом руководстве приведены примеры использования этой функции. Используя препроцессор наподобие Sass и функцию calc() , создать удобную сетку будет совсем несложно. Кроме того, эта функция поддерживается почти всеми браузерами.

See Can I Use calc? Data on support for the calc feature across the major browsers from caniuse.com.

7. Выравнивание фиксированных элементов

Функцию calc() также можно использовать для выравнивания элементов с фиксированным положением. Например, если у вас есть обёртка с полями переменного размера слева и справа и вам нужно точно выровнять элемент внутри обёртки, то вам придётся поломать голову, выбирая правильный размер отступа. С calc() вы можете сочетать абсолютные и относительные величины для идеального выравнивания:

8. Анимации при помощи cubic-bezier()

Для того, чтобы сделать пользовательский интерфейс сайта или приложения более привлекательным, вы можете использовать анимации. К сожалению, базовые варианты весьма скудны: например, «linear» или «ease-in-out» . Всякие подвижные анимации вообще не входят в стандартный набор. Но с функцией cubic-bezier() вы можете анимировать элементы именно так, как захотите.

cubic-bezier() можно использовать двумя способами — понять её математическую основу и написать самому или использовать генератор. Думаю, второй вариант предпочтительнее.

Заключение

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

Применение CSS attr и content для создания подсказки

Дата публикации: 2013-07-09

От автора: оказывается, я влюблен в content и attr CSS; я недавно писал о том, как можно в общем применять эти свойство и выражение, как выполнить в CSS счетчики и воспользоваться ими для локализации. Я хотел бы поделиться с вами несколькими методами применения выражения attr и свойства content для назначения стилей всплывающим подсказкам — тултипам.

Подсказка 1: Альтернатива атрибуту title

Атрибут title применим для отображения простых текстовых всплывающих подсказок, но менять стили «виртуальных» тултипов нельзя. Вместо того можно заместить эти подсказки, воспользовавшись атрибутом data-tooltip и небольшим количеством CSS:

Я избежал использования атрибута title, потому что не хочу отобразить ни «родной», ни пользовательский тултип. У этой стратегии имеются некоторые недостатки, о которых вам нужно знать. Вам придется хардкодить расположение всплывающей подсказки для того, чтобы у элемента с тултипом около края окна просмотра контент выходил за экран. В отдельных случаях, однако, так можно слегка оживить базовый тултип.

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

Подсказка 2: Обзор HTML

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

Время от времени я отображаю содержимое, установив основную непрозрачность на 30%, иногда просто показываю нужную мне информацию при проведении мышью. Я выполнил это решение в Mozilla Developer Network в режиме редактирования, отображая сводный текст SEO с всплывающей подсказкой сверху самого текста. Простое и блестящее решение.

Не могу поверить, что так долго пренебрегал использованием attr и content. Это – отличная штука, даже когда просто помогает при разработке. Кроме того, attr и content великолепно подходят для счетчиков и локализации; а вы для чего ими пользуетесь?

Автор: David Walsh

Редакция: Команда webformyself.

Атрибуты и свойства

»» В данной статье используется исходный код для примеров. Сохраните эту страницу для тестирования приведенных ниже примеров.

Библиотека jQuery позволяет получать и устанавливать значения атрибутов элементов, содержащихся в объекте jQuery. Методы jQuery, предназначенные для работы с атрибутами, описаны в таблице ниже:

Методы для работы с атрибутами

Метод Описание
attr(имя) Возвращает значение атрибута с указанным именем для первого из элементов, содержащихся в объекте jQuery
attr(имя, значение) Устанавливает значение атрибута с указанным именем для всех элементов, содержащихся в объекте jQuery
attr(объект отображения) Устанавливает атрибуты, указанные в объекте отображения, для всех элементов, содержащихся в объекте jQuery
attr(имя, функция) Устанавливает указанный атрибут для всех элементов, содержащихся в объекте jQuery, с помощью функции
removeAttr(имя), removeAttr(имя[]) Удаляет атрибут (атрибуты) из всех элементов, содержащихся в объекте jQuery
prop(имя) Возвращает значение указанного свойства для первого из элементов, содержащихся в объекте jQuery
prop(имя, значение), prop(объект отображения) Устанавливает значение одного или нескольких свойств для всех элементов, содержащихся в объекте jQuery
prop(имя, функция) Устанавливает значение указанного свойства для всех элементов, содержащихся в объекте jQuery, с использованием функции
removeProp(имя) Удаляет указанное свойство из всех элементов, содержащихся в объекте jQuery

Если метод attr() вызывается с одним аргументом, jQuery возвращает значение указанного атрибута для первого из элементов выбранного набора. Соответствующий пример приведен ниже:


В этом сценарии мы выбираем все элементы img в документе, а затем используем метод attr() для получения значения атрибута src, при считывании которого получаем строку. На консоль выводится следующий результат:

Получение значения атрибута для всех элементов, содержащихся в объекте jQuery, обеспечивается совместным применением методов each() и attr():

В этом сценарии из объекта HTMLElement, передаваемого функции в качестве аргумента, с помощью функции $() создается объект jQuery. Этот объект содержит единственный элемент, который идеально подходит для метода attr().

Установка значений атрибутов

Если метод attr() используется для установки значения атрибута, то изменение применяется ко всем элементам, содержащимся в объекте jQuery. Таким образом, в данном случае метод ведет себя иначе, чем при считывании атрибутов, когда возвращается лишь значение атрибута одного элемента. При установке атрибута метод attr() возвращает объект jQuery, что означает возможность использования цепочки вызовов.

Пример сценария, выполняющего установку значения атрибута, приведен ниже:

В этом сценарии выбираются все элементы img в документе, и для атрибута src устанавливается ссылка на картинку lily.png. Установленное значение применяется ко всем выбранным элементам, как показано на рисунке:

Установка нескольких атрибутов

Можно установить значения нескольких атрибутов одним вызовом метода attr(), передав ему в качестве аргумента объект. Свойства такого объекта интерпретируются как имена атрибутов, а значения свойств — как значения атрибута. Этот объект принято называть . Соответствующий пример приведен ниже:

В этом сценарии создается объект, определяющий свойства с именами src и style. Далее в документе выбираются элементы img, и методу attr() передается объект отображения. Вид страницы в окне браузера приведен на рисунке:

Динамическая установка значений атрибутов

Назначаемые атрибутам значения можно определять во время выполнения сценария, передавая методу attr() функцию в качестве аргумента. Соответствующий пример приведен ниже:

Аргументы, передаваемые указанной функции, — это индекс обрабатываемого элемента в наборе и прежнее значение атрибута. Переменная this ссылается на текущий обрабатываемый объект HTMLElement. Если вы хотите изменить атрибут, то функция должна вернуть строку, содержащую новое значение. Если же результат не возвращается, то используется прежнее значение атрибута. В данном примере функция используется для избирательного изменения изображений, отображаемых элементами img.

Удаление атрибутов

Атрибуты можно удалять (отменять установку) с помощью метода removeAttr(), как показано в примере ниже:

В этом примере атрибут style сначала устанавливается с помощью метода attr(), а затем удаляется из нечетных элементов img с помощью метода removeAttr(). Вид страницы в окне браузера приведен на рисунке:

Работа со свойствами

Каждому варианту метода attr() соответствует аналогичный вариант вызова метода prop(). Различие между обоими методами состоит в том, что методы prop() имеют дело со свойствами, определяемыми объектами HTMLElement, а не со значениями атрибутов. Часто атрибуты и соответствующие свойства имеют одинаковые имена, но это не всегда так. В качестве простого примера можно привести атрибут class, представленный в объекте HTMLElement свойством className.

Пример использования метода prop() для получения значения этого свойства приведен ниже:

В этом примере сначала выбираются в виде набора, а затем последовательно перебираются с помощью метода each() все элементы, у которых имеется атрибут class. Для каждого элемента на консоль выводится его тип и значение свойства className.

Атрибуты и DOM-свойства

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/dom-attributes-and-properties.

При чтении HTML браузер генерирует DOM-модель. При этом большинство стандартных HTML-атрибутов становятся свойствами соответствующих объектов.

Например, если тег выглядит как , то у объекта будет свойство body. .

Но это преобразование – не один-в-один. Бывают ситуации, когда атрибут имеет одно значение, а свойство – другое. Бывает и так, что атрибут есть, а свойства с таким названием не создаётся.

Если коротко – HTML-атрибуты и DOM-свойства обычно, но не всегда соответствуют друг другу, нужно понимать, что такое свойство и что такое атрибут, чтобы работать с ними правильно.

Свои DOM-свойства

Ранее мы видели некоторые встроенные свойства DOM-узлов. Но, технически, никто нас ими не ограничивает.

Узел DOM – это объект, поэтому, как и любой объект в JavaScript, он может содержать пользовательские свойства и методы.

Например, создадим в document.body новое свойство и запишем в него объект:

Можно добавить и новую функцию:

Нестандартные свойства и методы видны только в JavaScript и никак не влияют на отображение соответствующего тега.

Обратим внимание, пользовательские DOM-свойства:

  • Могут иметь любое значение.
  • Названия свойств чувствительны к регистру.
  • Работают за счёт того, что DOM-узлы являются объектами JavaScript.

Атрибуты


Элементам DOM, с другой стороны, соответствуют HTML-теги, у которых есть текстовые атрибуты.

Конечно, здесь речь именно об узлах-элементах, не о текстовых узлах или комментариях.

Доступ к атрибутам осуществляется при помощи стандартных методов:

  • elem.hasAttribute(name) – проверяет наличие атрибута
  • elem.getAttribute(name) – получает значение атрибута
  • elem.setAttribute(name, value) – устанавливает атрибут
  • elem.removeAttribute(name) – удаляет атрибут

Эти методы работают со значением, которое находится в HTML.

Также все атрибуты элемента можно получить с помощью свойства elem.attributes , которое содержит псевдо-массив объектов типа Attr.

В отличие от свойств, атрибуты:

  • Всегда являются строками.
  • Их имя нечувствительно к регистру (ведь это HTML)
  • Видны в innerHTML (за исключением старых IE)

Рассмотрим отличия между DOM-свойствами и атрибутами на примере HTML-кода:

Пример ниже устанавливает атрибуты и демонстрирует их особенности.

При запуске кода выше обратите внимание:

  1. getAttribute(‘About’) – первая буква имени атрибута About написана в верхнем регистре, а в HTML – в нижнем, но это не имеет значения, так как имена нечувствительны к регистру.
  2. Мы можем записать в атрибут любое значение, но оно будет превращено в строку. Объекты также будут автоматически преобразованы.
  3. После добавления атрибута его можно увидеть в innerHTML элемента.
  4. Коллекция attributes содержит все атрибуты в виде объектов со свойствами name и value .

Когда полезен доступ к атрибутам?

Когда браузер читает HTML и создаёт DOM-модель, то он создаёт свойства для всех стандартных атрибутов.

Например, свойства тега ‘A’ описаны в спецификации DOM: HTMLAnchorElement.

Например, у него есть свойство «href» . Кроме того, он имеет «id» и другие свойства, общие для всех элементов, которые описаны в спецификации в HTMLElement.

Все стандартные свойства DOM синхронизируются с атрибутами, однако не всегда такая синхронизация происходит 1-в-1, поэтому иногда нам нужно значение именно из HTML, то есть атрибут.

Рассмотрим несколько примеров.

Ссылка «как есть» из атрибута href

Синхронизация не гарантирует одинакового значения в атрибуте и свойстве.

Для примера, посмотрим, что произойдёт с атрибутом «href» при изменении свойства:

Это происходит потому, что атрибут может быть любым, а свойство href , в соответствии со спецификацией W3C, должно быть полной ссылкой.

Стало быть, если мы хотим именно то, что в HTML, то нужно обращаться через атрибут.

Кстати, есть и другие атрибуты, которые не копируются в точности. Например, DOM-свойство input.checked имеет логическое значение true/false , а HTML-атрибут checked – любое строковое, важно лишь его наличие.

Работа с checked через атрибут и свойство:

Исходное значение value

Изменение некоторых свойств обновляет атрибут. Но это скорее исключение, чем правило.

Чаще синхронизация – односторонняя: свойство зависит от атрибута, но не наоборот.

Например, при изменении свойства input.value атрибут input.getAttribute(‘value’) не меняется:

То есть, изменение DOM-свойства value на атрибут не влияет, он остаётся таким же.

А вот изменение атрибута обновляет свойство:

Эту особенность можно красиво использовать.

Получается, что атрибут input.getAttribute(‘value’) хранит оригинальное (исходное) значение даже после того, как пользователь заполнил поле и свойство изменилось.

Например, можно взять изначальное значение из атрибута и сравнить со свойством, чтобы узнать, изменилось ли значение. А при необходимости и перезаписать свойство атрибутом, отменив изменения.


Классы в виде строки: className

Атрибуту «class» соответствует свойство className .

Так как слово «class» является зарезервированным словом в JavaScript, то при проектировании DOM решили, что соответствующее свойство будет называться className .

Кстати, есть и другие атрибуты, которые называются иначе, чем свойство. Например, атрибуту for ( ) соответствует свойство с названием htmlFor .

Классы в виде объекта: classList

Атрибут class – уникален. Ему соответствует аж целых два свойства!

Работать с классами как со строкой неудобно. Поэтому, кроме className , в современных браузерах есть свойство classList .

Свойство classList – это объект для работы с классами.

Оно поддерживается в IE начиная с IE10, но его можно эмулировать в IE8+, подключив мини-библиотеку classList.js.

  • elem.classList.contains(«class») – возвращает true/false , в зависимости от того, есть ли у элемента класс class .
  • elem.classList.add/remove(«class») – добавляет/удаляет класс class
  • elem.classList.toggle(«class») – если класса class нет, добавляет его, если есть – удаляет.

Кроме того, можно перебрать классы через for , так как classList – это псевдо-массив.

Нестандартные атрибуты

У каждого элемента есть некоторый набор стандартных свойств, например для это будут href , name , а для это будут src , alt , и так далее.

Точный набор свойств описан в стандарте, обычно мы более-менее представляем, если пользуемся HTML, какие свойства могут быть, а какие – нет.

Для нестандартных атрибутов DOM-свойство не создаётся.

Свойство является стандартным, только если оно описано в стандарте именно для этого элемента.

То есть, если назначить элементу атрибут href , то свойство img.href от этого не появится. Как, впрочем, и если назначить ссылке атрибут alt :

Нестандартные атрибуты иногда используют для CSS.

В примере ниже для показа «состояния заказа» используется атрибут order-state :

Почему именно атрибут? Разве нельзя было сделать классы .order-state-new , .order-state-pending , order-state-canceled ?

Конечно можно, но манипулировать атрибутом из JavaScript гораздо проще.

Например, если нужно отменить заказ, неважно в каком он состоянии сейчас – это сделает код:

Для классов – нужно знать, какой класс у заказа сейчас. И тогда мы можем снять старый класс, и поставить новый:

…То есть, требуется больше исходной информации и надо написать больше букв. Это менее удобно.

Проще говоря, значение атрибута – произвольная строка, значение класса – это «есть» или «нет», поэтому естественно, что атрибуты «мощнее» и бывают удобнее классов как в JS так и в CSS.

Свойство dataset, data-атрибуты

С помощью нестандартных атрибутов можно привязать к элементу данные, которые будут доступны в JavaScript.

Как правило, это делается при помощи атрибутов с названиями, начинающимися на data- , например:

Стандарт HTML5 специально разрешает атрибуты data-* и резервирует их для пользовательских данных.

При этом во всех браузерах, кроме IE10-, к таким атрибутам можно обратиться не только как к атрибутам, но и как к свойствам, при помощи специального свойства dataset :

Обратим внимание – название data-user-location трансформировалось в dataset.userLocation . Дефис превращается в большую букву.

Полифил для атрибута hidden

Для старых браузеров современные атрибуты иногда нуждаются в полифиле. Как правило, такой полифил включает в себя не только JavaScript, но и CSS.

Этот атрибут должен прятать элемент, действие весьма простое, для его поддержки в HTML достаточно такого CSS:

Если запустить в IE11- пример выше, то

Это потому что CSS «не видит» присвоенное свойство, нужно синхронизировать его в атрибут.


Вот так – уже работает:

«Особенности» IE8

Если вам нужна поддержка этих версий IE – есть пара нюансов.

Во-первых, версии IE8- синхронизируют все свойства и атрибуты, а не только стандартные:

При этом даже тип данных не меняется. Атрибут не становится строкой, как ему положено.

Ещё одна некорректность IE8-: для изменения класса нужно использовать именно свойство className , вызов setAttribute(‘class’, . ) не сработает.

Вывод из этого довольно прост – чтобы не иметь проблем в IE8, нужно использовать всегда только свойства, кроме тех ситуаций, когда нужны именно атрибуты. Впрочем, это в любом случае хорошая практика.

Итого

  • Атрибуты – это то, что написано в HTML.
  • Свойство – это то, что находится внутри DOM-объекта.

Таблица сравнений для атрибутов и свойств:

Свойства Атрибуты
Любое значение Строка
Названия регистрозависимы Не чувствительны к регистру
Не видны в innerHTML Видны в innerHTML

Синхронизация между атрибутами и свойствами:

  • Стандартные свойства и атрибуты синхронизируются: установка атрибута автоматически ставит свойство DOM. Некоторые свойства синхронизируются в обе стороны.
  • Бывает так, что свойство не совсем соответствует атрибуту. Например, «логические» свойства вроде checked , selected всегда имеют значение true/false , а в атрибут можно записать произвольную строку.Выше мы видели другие примеры на эту тему, например href .
  • Нестандартный атрибут (если забыть глюки старых IE) никогда не попадёт в свойство, так что для кросс-браузерного доступа к нему нужно обязательно использовать getAttribute .
  • Атрибуты, название которых начинается с data- , можно прочитать через dataset . Эта возможность не поддерживается IE10-.

Для того, чтобы избежать проблем со старыми IE, а также для более короткого и понятного кода старайтесь везде использовать свойства, а атрибуты – только там, где это действительно нужно.

А действительно нужны атрибуты очень редко – лишь в следующих трёх случаях:

  1. Когда нужно кросс-браузерно получить нестандартный HTML-атрибут.
  2. Когда нужно получить «оригинальное значение» стандартного HTML-атрибута, например, .
  3. Когда нужно получить список всех атрибутов, включая пользовательские. Для этого используется коллекция attributes .

Если вы хотите использовать собственные атрибуты в HTML, то помните, что атрибуты с именем, начинающимся на data- валидны в HTML5 и современные браузеры поддерживают доступ к ним через свойство dataset .

Задачи

Поставьте класс ссылкам

Сделайте жёлтыми внешние ссылки, добавив им класс external .

jQuery: как получить значение атрибута?

Очередной пост-заметка, для себя(хоть и помню наизусть, записать стоит) и новичков. О том как получить значение какого либо атрибута элемента с помощью функций jQuery? На самом деле все достаточно просто, поэтому я просто перейду непосредственно к самим примерам.

В этом примере при помощи функции «attr», мы получаем значение «rel» тега «a». Действие происходит при клике на объект (ссылку) с идентификатором стиля #ankor

Таким же образом мы можем получить значение любого атрибута, у любого обькта на странице. Как при клике на него, так и после загрузки страницы:

После клика на объект #ankor, получаем значение href у всех ссылок на странице, в массив:

Получаем значение атрибуте rel, у элемента с идентификатором #ankor, после полной загрузки структуры DOM (страницы).

Работать jQuery как всегда очень просто и интересно, JavaScript становится мощным и удобным инструментом даже в руках начинающего программиста. Надеюсь моя небольшая заметочка пригодится не только мне=)

Похожие записи

  • Добавление поля, без перезагрузки страницы (0)
  • Ширина, высота и позиция элемента. Примеры javaScript VS jQuery. (0)
  • Комментарии на PHP, Ajax, mySQL (95)
  • Увеличение фото. jQuery (4)
  • jQuery календарь при заполнении даты в поле Input (1)
  • Отправка POST с помощью Ajax (0)
  • Всплывающие подсказки на jquery (0)

5 комментариев to “jQuery: как получить значение атрибута?”

Добрый вечер. Надо получить href и вывести в консоль, но всегда выводиться только первая ссылка(one.php)
:

$(‘body’).live(«click», function(event) <
var url = $(«[href]»).attr(«href»);event.preventDefault(),
console.log(url);
>);

Если сделать $(this).attr(«href»), то выводит в консоль undefined
Как решить проблему?

добрый день! Решение будет таким
$(‘body’).live(‘click’, function(event) <
var url = $(this).prop(‘href’);event.preventDefault(),
console.log(url);
>);

Не понимаю почему, но результат один и тот же, или первая ссылка постоянно выводиться или undefined

Да, и я пропустил этот момент)) Вот правильный код, если с Live

Илон Маск рекомендует:  Dos fn 45h дублировать описатель файла dup
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL