Уроки JavaScript – Доступ до вузлів та атрибутів в DOM
У цій статті ми продовжимо говорити про об’єктну модель документів (DOM) і розглянемо основні способи доступу до неї за допомогою JavaScript.
Давайте для прикладу візьмемо невеликий HTML документ, в якому є абзац та невпорядкований список:
<!DOCTYPE html> <html lang="uk-UA"> <head> <meta charset="UTF-8"> <title>JavaScript – доступ до вузлів DOM</title> </head> <body> <p id="paragraph">Перший тестовий параграф</p> <ul> <li>Пункт 1 невпорядкованого списку</li> <li>Пункт 2 невпорядкованого списку</li> <li>Пункт 3 невпорядкованого списку</li> <li>Пункт 4 невпорядкованого списку</li> <li>Пункт 5 невпорядкованого списку</li> </ul> </body> </html>
У цьому прикладі ми збираємося отримати доступ до нашого абзацу за допомогою методу DOM ‘getElementById
‘:
var firstParagraph = document.getElementById('paragraph'); // тепер у нас є посилання на вузол DOM. Цей вузол – перший параграф
Змінна firstParagraph
тепер є посиланням на вузол DOM. З цим вузлом ми можемо зробити кілька речей – ми можемо отримати його вміст і атрибути, а також можемо маніпулювати будь-яким його аспектом. Ми можемо видалити його, клонувати або перемістити в інші частини дерева DOM.
До всіх елементів, які є в документі, ми можемо отримати доступ за допомогою JavaScript і DOM API. Наприклад, подібним способом ми можемо отримати доступ і до невпорядкованого списку, єдина проблема полягає в тому, що у цього списку немає ідентифікатора (ID). Ми можемо присвоїти йому ідентифікатор, а потім використовувати той же метод, що і вище, або ми можемо отримати до нього доступ, використовуючи метод ‘getElementsByTagName
‘ (доступ до елементів за їх тегами):
var vseNeuporyadochenniyeSpiski = document.getElementsByTagName('ul'); // 'getElementsByTagName' повертає колекцію/список всіх доступних вузлів
getElementsByTagName
Метод ‘getElementsByTagName
‘ повертає колекцію/список активних вузлів. Ця колекція схожа на масив в тому, що у неї є властивість розміру (length
). Важливо відзначити, що ці колекції є «живими» — якщо ви додасте новий елемент в DOM, то колекція оновиться сама. Оскільки це масивоподібний об’єкт, ми можемо отримати доступ до кожного вузла через індекс, від 0 до загальної довжини колекції (мінус 1):
// отримуємо доступ до одного (першого) невпорядкованого списку: індекс [0] var neuporyadochenniySpisok = document.getElementsByTagName('ul')[0]; // створюємо список вузлів всіх елементів списку в тегові UL: var vseElementiSpiska = neuporyadochenniySpisok.getElementsByTagName('li'); // тепер ми можемо перебрати кожен елемент списку, використовуючи цикл FOR: for (var i = 0, length = vseElementiSpiska.length; i < length; i++) { // отримуємо текстовий вузол та виводимо його вміст: alert( vseElementiSpiska[i].firstChild.data ); }
Обхід DOM
Термін «обхід» використовується для опису дії переміщення по DOM і пошуку вузлів. DOM API надає нам безліч властивостей вузлів, які ми можемо використовувати для переміщення вгору і вниз по всіх вузлах в документі.
Наступні властивості є у всіх вузлів і дозволяють отримувати доступ до пов’язаних/близьким вузлів:
Node.childNodes
: ви можете використовувати цю властивість для доступу до всіх прямих дочірніх вузлів одного елемента. Це буде об’єкт, схожий на масив, який можна буде «перебрати».Node.firstChild
: це те ж саме, що і доступ до першого елементу в масиві ‘childNodes
‘ (‘Element.childNodes[0]
‘).Node.lastChild
: це те ж саме, що і доступ до останнього елемента в масиві ‘childNodes
‘ (‘Element.childNodes[Element.childNodes.length-1]
‘).Node.parentNode
: ця властивість дає вам доступ до батьківського вузла поточного вузла. В цьому випадку у вас буде доступ тільки до одного батьківського вузла. Щоб отримати доступ до наступних предків батьківського вузла, використовуйте «node.parentNode.parentNode
» і т.д.Node.nextSibling
: ця властивість дає вам доступ до наступного вузла на тому ж рівні в дереві DOM.Node.previousSibling
: ця властивість дає вам доступ до останнього вузла того ж рівня в дереві DOM.
Отже, як ви можете бачити, обхід DOM неймовірно простий, тут головне знати імена властивостей.
Також для прикладу вище (HTML документ) слід зазначити одну річ: навіть порожній елемент буде отримано в якості вузла. Наприклад, якщо у вас між тегом <ul>
і першим <li>
є порожній простір, він фактично буде вважатися вузлом. Точно так же невпорядкований список насправді може не вважатися наступним вузлом для абзацу (nextSibling
), якщо між ними є порожній простір. У цьому випадку він буде іншим вузлом. Як правило, в таких ситуаціях ви повинні обійти масив childNodes
і протестувати nodeType
. nodeType
, що дорівнює 1, означає, що це елемент; рівний 2 означає, що це атрибут; рівний 3 означає, що це текстовий вузол і так далі.
На сьогодні все. Ми сподіваємося, що ви навчилися чогось корисного з сьогоднішнього уроку. У наступних уроках ми продовжимо детальне вивчення основних аспектів JavaScript.