|
2 | 2 |
|
3 | 3 | Властивості навігації по DOM чудові, коли елементи розташовані близько один до одного. А якщо ні? Як отримати довільний елемент сторінки?
|
4 | 4 |
|
5 |
| -Для цього існують додаткові методи пошуку. |
| 5 | +Для цього в DOM існують додаткові методи пошуку. |
6 | 6 |
|
7 | 7 | ## document.getElementById або просто id
|
8 | 8 |
|
9 |
| -Якщо елемент має атрибут `id`, ми можемо отримати його за допомогою методу `document.getElementById(id)`, незалежно від того, де він знаходиться. |
| 9 | +Якщо елемент має атрибут `id`, ми можемо отримати його викликом `document.getElementById(id)`, незалежно від того, де він знаходиться. |
10 | 10 |
|
11 | 11 | Наприклад:
|
12 | 12 |
|
|
42 | 42 | </script>
|
43 | 43 | ```
|
44 | 44 |
|
45 |
| -...Але це лише якщо ми не оголошуємо змінну JavaScript з тим самим ім’ям, інакше вона матиме пріоритет: |
| 45 | +...Але це лише якщо ми не оголосили змінну JavaScript з таким же ім’ям, інакше вона матиме пріоритет: |
46 | 46 |
|
47 | 47 | ```html run untrusted height=0
|
48 | 48 | <div id="elem"></div>
|
|
57 | 57 | ```warn header="Будь ласка, не використовуйте id-іменовані глобальні змінні для доступу до елементів"
|
58 | 58 | Ця поведінка описана [у специфікації](https://html.spec.whatwg.org/multipage/window-object.html#named-access-on-the-window-object), тож це свого роду стандарт. Але він підтримується в основному для сумісності.
|
59 | 59 |
|
60 |
| -Браузер намагається нам допомогти, змішуючи простори імен JS і DOM. Це добре для простих сценаріїв, вбудованих у HTML, але загалом це не дуже добре. Можуть виникнути конфлікти імен. Крім того, коли хтось читає JS-код і не бачить HTML, незрозуміло, звідки приходить змінна. |
| 60 | +Браузер намагається нам допомогти, змішуючи простори імен JS і DOM. Це зручно для простих скриптів, які знаходяться прямо в HTML, але загалом це не дуже добре. Можуть виникнути конфлікти імен. Крім того, коли хтось читає JS-код і не бачить HTML, незрозуміло, звідки приходить змінна. |
61 | 61 |
|
62 |
| -Тут у підручнику ми використовуємо `id` для прямого посилання на елемент для стислості, коли очевидно, звідки цей елемент походить. |
| 62 | +У цьому посібнику ми будемо використовувати `id` для прямого посилання на елемент для стислості, коли очевидно, звідки цей елемент походить. |
63 | 63 |
|
64 |
| -У реальному житті краще надавати перевагу `document.getElementById`. |
| 64 | +У реальному житті краще використовувати `document.getElementById`. |
65 | 65 | ```
|
66 | 66 |
|
67 |
| -```smart header="`id` має бути унікальним" |
68 |
| -`id` має бути унікальним. У документі може бути лише один елемент із заданим `id`. |
| 67 | +```smart header="Значення `id` має бути унікальним" |
| 68 | +Значення `id` має бути унікальним. У документі повинен бути лише один елемент із заданим `id`. |
69 | 69 |
|
70 |
| -Якщо є кілька елементів з однаковим `id`, то поведінка методів, які його використовують, буде непередбачуваною, наприклад. `document.getElementById` може повертати будь-який з таких елементів випадковим чином. Тому, будь ласка, дотримуйтеся правила та залишайте `id` унікальним. |
| 70 | +Якщо є кілька елементів з однаковим `id`, то поведінка методів, які його використовують є непередбачуваною. Наприклад, `document.getElementById` може повертати будь-який з таких елементів випадковим чином. Тому, будь ласка, дотримуйтеся правила та залишайте `id` унікальним. |
71 | 71 | ```
|
72 | 72 |
|
73 | 73 | ```warn header="Лише `document.getElementById`, а не `anyElem.getElementById`"
|
74 |
| -Метод `getElementById` можна викликати лише для об’єкта `document`. Він шукає вказаний `id` у всьому документі. |
| 74 | +Метод `getElementById` може бути викликаний лише на об’єкті `document`. Він шукає вказаний `id` у всьому документі. |
75 | 75 | ```
|
76 | 76 |
|
77 | 77 | ## querySelectorAll [#querySelectorAll]
|
78 | 78 |
|
79 |
| -До сьогодні найуніверсальніший метод -- це `elem.querySelectorAll(css)`, він повертає всі елементи всередині `elem`, що відповідають заданому CSS-селектору. |
| 79 | +Найбільш гнучким методом є `elem.querySelectorAll(css)`, який повертає всі елементи всередині `elem`, що відповідають заданому CSS-селектору. |
80 | 80 |
|
81 |
| -Тут ми шукаємо всі елементи `<li>`, які є останніми дочірніми: |
| 81 | +Тут ми шукаємо всі елементи `<li>`, які є останніми дочірніми елементами: |
82 | 82 |
|
83 | 83 | ```html run
|
84 | 84 | <ul>
|
|
103 | 103 | Цей метод дійсно потужний, оскільки можна використовувати будь-який CSS-селектор.
|
104 | 104 |
|
105 | 105 | ```smart header="Також можна використовувати псевдокласи"
|
106 |
| -Псевдокласи в CSS-селекторі, такі як `:hover` і `:active`, також підтримуються. Наприклад, `document.querySelectorAll(':hover')` поверне колекцію елементів, що знаходяться під курсором миші (у порядку вкладення: від крайнього `<html>` до найбільш вкладеного). |
| 106 | +Псевдокласи в CSS-селекторі, такі як `:hover` і `:active`, також підтримуються. Наприклад, `document.querySelectorAll(':hover')` поверне колекцію елементів, що знаходяться під курсором миші (у порядку вкладення: від зовнішнього `<html>` до найбільш вкладеного). |
107 | 107 | ```
|
108 | 108 |
|
109 | 109 | ## querySelector [#querySelector]
|
110 | 110 |
|
111 | 111 | Виклик `elem.querySelector(css)` повертає перший елемент, що відповідає даному CSS-селектору.
|
112 | 112 |
|
113 |
| -Іншими словами, результат такий самий, як і `elem.querySelectorAll(css)[0]`, але останній шукає *всі* елементи та вибирає один, а `elem.querySelector` просто шукає один. Тому його писати швидше і коротше. |
| 113 | +Іншими словами, результат такий самий, як і `elem.querySelectorAll(css)[0]`, але він спочатку знайде всі елементи, а потім візьме перший, тоді як `elem.querySelector` знайде лише перший та зупиниться. Цей метод не лише прискорює виконання, а й дозволяє скоротити кількість написаного коду. |
114 | 114 |
|
115 | 115 | ## matches
|
116 | 116 |
|
117 | 117 | Попередні методи виконували пошук по DOM.
|
118 | 118 |
|
119 |
| -[elem.matches(css)](https://dom.spec.whatwg.org/#dom-element-matches) нічого не шукає, він просто перевіряє, чи відповідає `elem` заданому CSS-селектору. Він повертає `true` або `false`. |
| 119 | +Метод [elem.matches(css)](https://dom.spec.whatwg.org/#dom-element-matches) нічого не шукає, він просто перевіряє, чи відповідає `elem` заданому CSS-селектору. Він повертає `true` або `false`. |
120 | 120 |
|
121 |
| -Цей метод стає в пригоді, коли ми перебираємо елементи (наприклад, у масиві чи чомусь подібному) і намагаємося відфільтрувати ті, які нас цікавлять. |
| 121 | +Цей метод стає в нагоді, коли ми перебираємо елементи (наприклад, у масиві чи чомусь подібному) і намагаємося відфільтрувати ті, які нас цікавлять. |
122 | 122 |
|
123 | 123 | Наприклад:
|
124 | 124 |
|
|
144 | 144 |
|
145 | 145 | Метод `elem.closest(css)` шукає найближчого предка, який відповідає CSS-селектору. Сам `elem` також включається в пошук.
|
146 | 146 |
|
147 |
| -Іншими словами, метод `closest` підіймається від елемента і перевіряє кожного з батьків. Якщо він збігається з селектором, пошук припиняється, і повертається предок. |
| 147 | +Іншими словами, метод `closest` йде вгору від елемента і перевіряє кожного з батьківських елементів. Якщо він відповідає заданому селектору, пошук припиняється, і повертається знайдений предок. |
148 | 148 |
|
149 | 149 | Наприклад:
|
150 | 150 |
|
|
174 | 174 |
|
175 | 175 | Сьогодні вони здебільшого історичні, оскільки `querySelector` є потужнішим і коротшим для написання.
|
176 | 176 |
|
177 |
| -Тому тут ми розглянемо їх переважно для повноти, тоді як ви все ще можете знайти їх у старому коді. |
| 177 | +Тому тут ми розглянемо їх переважно для повноти, тоді як ви все ще можете знайти їх у старих скриптах. |
178 | 178 |
|
179 |
| -- `elem.getElementsByTagName(tag)` шукає елементи з заданим тегом і повертає їх колекцію. Параметр `tag` також може бути зірочкою `"*"` для "будь-яких тегів". |
180 |
| -- `elem.getElementsByClassName(className)` повертає елементи, які мають заданий CSS-клас. |
| 179 | +- `elem.getElementsByTagName(tag)` шукає елементи з заданим тегом і повертає колекцію цих елементів. Параметр `tag` також може бути зірочкою `"*"` для "будь-яких тегів". |
| 180 | +- `elem.getElementsByClassName(className)` повертає елементи, які мають вказаний CSS-клас. |
181 | 181 | - `document.getElementsByName(name)` повертає елементи з заданим атрибутом `name` для всього документа. Використовується дуже рідко.
|
182 | 182 |
|
183 | 183 | Наприклад:
|
@@ -219,9 +219,9 @@ let divs = document.getElementsByTagName('div');
|
219 | 219 | ```
|
220 | 220 |
|
221 | 221 | ```warn header="Не забуваємо про літеру `\"s\"`!"
|
222 |
| -Розробники початківці іноді забувають про літеру `"s"`. Тобто вони намагаються викликати `getElementByTagName` замість <code>getElement<b>s</b>ByTagName</code>. |
| 222 | +У новачків у розробці іноді трапляються випадки, коли вони забувають про літеру `"s"`. Тобто вони намагаються викликати метод `getElementByTagName` замість <code>getElement<b>s</b>ByTagName</code>. |
223 | 223 |
|
224 |
| -Літера `"s"` відсутня в `getElementById`, оскільки повертає один елемент. Але `getElementsByTagName` повертає колекцію елементів, тому всередині є `"s"`. |
| 224 | +Літера `"s"` відсутня в назві методу `getElementById`, оскільки він повертає один елемент. А `getElementsByTagName` повертає колекцію елементів, тому всередині є `"s"`. |
225 | 225 | ```
|
226 | 226 |
|
227 | 227 | ````warn header="Повертає колекцію, а не елемент!"
|
@@ -363,12 +363,12 @@ document.getElementsByTagName('input')[0].value = 5;
|
363 | 363 | </tbody>
|
364 | 364 | </table>
|
365 | 365 |
|
366 |
| -Найчастіше використовуються `querySelector` і `querySelectorAll`, але `getElement(s)By*` може бути корисним час від часу або знаходитися в старому коді. |
| 366 | +Найчастіше використовуються `querySelector` і `querySelectorAll`, але `getElement(s)By*` може бути корисним час від часу або зустрічатися в старих скриптах. |
367 | 367 |
|
368 | 368 | Крім того:
|
369 | 369 |
|
370 |
| -- `elem.matches(css)` існує для того, щоб перевірити, чи відповідає `elem` заданому CSS-селектору. |
371 |
| -- `elem.closest(css)` існує для того, щоб шукати найближчого предка, який відповідає заданому CSS-селектору. Сам `elem` також перевіряється. |
| 370 | +- Існує метод `elem.matches(css)` , який перевіряє, чи відповідає `elem` заданому CSS-селектору. |
| 371 | +- Існує метод `elem.closest(css)` , який шукає найближчого предка, який відповідає заданому CSS-селектору. Сам `elem` також перевіряється. |
372 | 372 |
|
373 | 373 | І згадаймо тут ще один метод перевірки взаємовідносин нащадок-предок, оскільки він іноді стає в нагоді:
|
374 | 374 | - `elemA.contains(elemB)` повертає true, якщо `elemB` знаходиться всередині `elemA` (нащадок `elemA`) або коли `elemA==elemB`.
|
0 commit comments