Вступление
В предыдущем руководстве в этомseries, «https://www.digitalocean.com/community/tutorials/how-to-make-changes-to-the-dom[Как внести изменения в DOM], Мы рассмотрели, как создавать, вставлять, заменять и удалять элементы из объектной модели документа (DOM) с помощью встроенных методов. Увеличивая свои навыки работы с DOM, вы сможете лучше использовать интерактивные возможности JavaScript и изменять веб-элементы.
В этом уроке мы узнаем, как дополнительно изменить DOM, изменив стили, классы и другие атрибуты узлов HTML-элементов. Это даст вам лучшее понимание того, как манипулировать основными элементами в DOM.
Обзор выбора элементов
До недавнего времени популярная библиотека JavaScript под названиемjQuery чаще всего использовалась для выбора и изменения элементов в DOM. jQuery упростил процесс выбора одного или нескольких элементов и применения изменений ко всем из них одновременно. В «https://www.digitalocean.com/community/tutorials/how-to-access-elements-in-the-dom[How для доступа к элементам в DOM]» мы рассмотрели методы DOM для захвата и работы с узлы в ванильном JavaScript.
Для обзора:document.querySelector()
иdocument.getElementById()
- это методы, которые используются для доступа к одному элементу. Используяdiv
с атрибутомid
в примере ниже, мы можем получить доступ к этому элементу в любом случае.
Demo ID
МетодquerySelector()
более надежен, так как он может выбирать элемент на странице с помощью любого типа селектора.
// Both methods will return a single element
const demoId = document.querySelector('#demo-id');
Получая доступ к одному элементу, мы можем легко обновить часть элемента, такую как текст внутри.
// Change the text of one element
demoId.textContent = 'Demo ID text updated.';
Однако при доступе к нескольким элементам с помощью общего селектора, такого как определенный класс, мы должны пройтись по всем элементам в списке. В приведенном ниже коде у нас есть два элементаdiv
с общим значением класса.
Demo Class 1
Demo Class 2
Мы будем использоватьquerySelectorAll()
, чтобы захватить все элементы с примененным к нимdemo-class
, иforEach()
, чтобы просмотреть их и применить изменение. Также можно получить доступ к определенному элементу с помощьюquerySelectorAll()
так же, как и с массивом - с использованием обозначения скобок.
// Get a NodeList of all .demo elements
const demoClasses = document.querySelectorAll('.demo-class');
// Change the text of multiple elements with a loop
demoClasses.forEach(element => {
element.textContent = 'All demo classes updated.';
});
// Access the first element in the NodeList
demoClasses[0];
Это одно из самых важных отличий, которые следует учитывать при переходе от jQuery к обычному JavaScript. Многие примеры изменения элементов не объясняют процесс применения этих методов и свойств к нескольким элементам.
Свойства и методы в этой статье часто будут прикреплены кevent listeners, чтобы реагировать на щелчки, наведение курсора или другие триггеры.
[.note] #Note: МетодыgetElementsByClassName()
иgetElementsByTagName()
будут возвращать коллекции HTML, которые не имеют доступа к методуforEach()
, который есть уquerySelectorAll()
. В этих случаях вам нужно будет использовать стандартныйfor
loop для итерации по коллекции.
#
Изменение атрибутов
Атрибуты - это значения, которые содержат дополнительную информацию об элементах HTML. Обычно они входят в парыname/value и могут быть важны в зависимости от элемента.
Некоторые из наиболее распространенных атрибутов HTML - это атрибутsrc
тегаimg
,href
тегаa
,class
,id
, иstyle
. Полный список атрибутов HTML см. Вattribute list в сети разработчиков Mozilla. Пользовательские элементы, которые не являются частью стандарта HTML, будут добавлены сdata-
.
В JavaScript у нас есть четыре метода для изменения атрибутов элемента:
метод | Описание | пример |
---|---|---|
|
Возвращает логическое значение |
|
|
Возвращает значение указанного атрибута или |
|
|
Добавляет или обновляет значение указанного атрибута |
|
|
Удаляет атрибут из элемента |
|
Давайте создадим новый HTML-файл с тегомimg
с одним атрибутом. Мы будем ссылаться на общедоступное изображение, доступное через URL, но вы можете заменить его на другое локальное изображение, если вы работаете в автономном режиме.
attributes.html
Когда вы загружаете указанный выше HTML-файл в современный веб-браузер и открываете встроенныйDeveloper Console, вы должны увидеть что-то вроде этого:
Теперь мы можем проверить все методы атрибутов на лету.
// Assign image element
const img = document.querySelector('img');
img.hasAttribute('src'); // returns true
img.getAttribute('src'); // returns "...shark.png"
img.removeAttribute('src'); // remove the src attribute and value
На этом этапе вы удалите атрибутsrc
и значение, связанные сimg
, но вы можете сбросить этот атрибут и присвоить значение альтернативному изображению с помощьюimg.setAttribute()
:
img.setAttribute('src', 'https://js-tutorials.nyc3.digitaloceanspaces.com/octopus.png');
Наконец, мы можем изменить атрибут напрямую, присвоив новое значение атрибуту как свойству элемента, вернувsrc
в файлshark.png
img.src = 'https://js-tutorials.nyc3.digitaloceanspaces.com/shark.png';
Любой атрибут может быть отредактирован таким же образом, как и вышеописанными методами.
МетодыhasAttribute()
иgetAttribute()
обычно используются сconditional statements, а методыsetAttribute()
иremoveAttribute()
используются для непосредственного изменения DOM.
Модификация Классов
Атрибутclass соответствуетCSS class selectors. Не следует путать сES6 classes, специальным типом функции JavaScript.
Классы CSS используются для применения стилей к нескольким элементам, в отличие от идентификаторов, которые могут существовать только один раз на страницу. В JavaScript у нас есть свойстваclassName
иclassList
для работы с атрибутом class.
Method/Property | Описание | пример |
---|---|---|
|
Получает или задает значение класса |
|
|
Добавляет одно или несколько значений класса |
|
|
Включает или выключает класс |
|
|
Проверяет, существует ли значение класса |
|
|
Заменить существующее значение класса новым значением класса |
|
|
Удалить значение класса |
|
Мы сделаем еще один HTML-файл для работы с методами класса, с двумя элементами и несколькими классами.
classes.html
Div 1
Div 2
Когда вы открываете файлclasses.html
в веб-браузере, вы должны получить визуализацию, которая выглядит примерно так:
СвойствоclassName
было введено для предотвращения конфликтов с ключевым словомclass
, найденным в JavaScript и других языках, имеющих доступ к DOM. Вы можете использоватьclassName
для присвоения значения непосредственно классу.
// Select the first div
const div = document.querySelector('div');
// Assign the warning class to the first div
div.className = 'warning';
Мы присвоили классwarning
, определенный в значениях CSSclasses.html
, первомуdiv
. Вы получите следующий вывод:
Обратите внимание, что если какие-либо классы уже существуют в элементе, это переопределит их. Вы можете добавить несколько классов, разделенных пробелами, с помощью свойстваclassName
или использовать его без операторов присваивания, чтобы получить значение класса для элемента.
Другой способ изменить классы - использовать свойствоclassList
, которое включает несколько полезных методов. Эти методы аналогичны методам jQueryaddClass
,removeClass
иtoggleClass
.
// Select the second div by class name
const activeDiv = document.querySelector('.active');
activeDiv.classList.add('hidden'); // Add the hidden class
activeDiv.classList.remove('hidden'); // Remove the hidden class
activeDiv.classList.toggle('hidden'); // Switch between hidden true and false
activeDiv.classList.replace('active', 'warning'); // Replace active class with warning class
После выполнения вышеуказанных методов ваша веб-страница будет выглядеть следующим образом:
В отличие от примераclassName
, использованиеclassList.add()
добавит новый класс в список существующих классов. Вы также можете добавить несколько классов в виде строк через запятую. Также можно использоватьsetAttribute
для изменения класса элемента.
Модификация Стилей
Свойствоstyle повторяет встроенные стили в элементе HTML. Часто стили будут применяться к элементам с помощью таблицы стилей, как мы делали ранее в этой статье, но иногда нам приходится напрямую добавлять или редактировать встроенный стиль.
Мы сделаем короткий пример, чтобы продемонстрировать стили редактирования с помощью JavaScript. Ниже представлен новый HTML-файл сdiv
, в котором для отображения квадрата применены некоторые встроенные стили.
styles.html
Div
При открытии в веб-браузереstyles.html
будет выглядеть примерно так:
Один из вариантов редактирования стилей -setAttribute()
.
// Select div
const div = document.querySelector('div');
// Apply style to div
div.setAttribute('style', 'text-align: center');
Однако это удалит все существующие встроенные стили из элемента. Поскольку это, вероятно, не предполагаемый эффект, лучше использовать атрибутstyle
напрямую.
div.style.height = '100px';
div.style.width = '100px';
div.style.border = '2px solid black';
Свойства CSS написаны в кебаб-регистре, который представляет собой строчные слова, разделенные тире. Важно отметить, что CSS-свойства kebab-case нельзя использовать в свойстве стиля JavaScript. Вместо этого они будут заменены их эквивалентом camelCase, когда первое слово будет строчным, а все последующие слова будут написаны заглавными буквами. Другими словами, вместоtext-align
мы будем использоватьtextAlign
для свойства стиля JavaScript.
// Make div into a circle and vertically center the text
div.style.borderRadius = '50%';
div.style.display = 'flex';
div.style.justifyContent = 'center';
div.style.alignItems = 'center';
После завершения вышеуказанных модификаций стиля на финальном рендерингеstyles.html
будет отображаться круг:
Если к элементу необходимо применить много стилистических изменений, лучший способ - применить стили к классу и добавить новый класс. Однако в некоторых случаях изменение атрибута встроенного стиля будет необходимо или более просто.
Заключение
Элементам HTML часто присваивается дополнительная информация в виде атрибутов. Атрибуты могут состоять из пар имя / значение, и некоторые из наиболее распространенных атрибутов - этоclass
иstyle
.
В этом руководстве мы узнали, как получить доступ, изменить и удалить атрибуты элемента HTML в DOM, используя простой JavaScript. Мы также узнали, как добавлять, удалять, переключать и заменять классы CSS для элемента и как редактировать встроенные стили CSS. Для дополнительного чтения ознакомьтесь с документацией поattributes в сети разработчиков Mozilla.