JS властивість Event.bubbles


Загальний опис

bubbles — це властивість об'єкта події в JavaScript, яка повертає логічне значення (true або false). Вона визначає, чи може подія спливати (підніматися) по ланцюжку DOM-елементів. Якщо значення true, подія буде "спливати" від поточного елемента до його батьківських елементів, поки не досягне кореня документу або не буде зупинена. Якщо false, подія не спливатиме, а буде оброблена тільки на поточному елементі.

Події, такі як click, за замовчуванням підтримують спливання, тому їх властивість bubbles дорівнює true. Інші події, наприклад focus або blur, не підтримують спливання, тому їх властивість bubbles дорівнює false. Це важлива особливість, оскільки вона дозволяє програмісту контролювати, як і де події повинні оброблятися.

Спливання подій є частиною механізму обробки подій в DOM і дозволяє ловити події не тільки на елементі, який їх генерує, а й на будь-якому з батьківських елементів. Наприклад:

document.body.addEventListener('click', (event) => {
  if (event.bubbles) {
    console.log('Подія спливає: ' + event.type);
  }
});

У цьому прикладі, якщо користувач клацає на будь-якому елементі сторінки, подія буде спливати до тіла документа, і консоль виведе тип події, оскільки вона підтримує спливання.

Зупинити спливання події можна за допомогою методу stopPropagation(). Наприклад, якщо не бажаєте, щоб подія продовжувала підніматися, ви можете це зупинити:

element.addEventListener('click', (event) => {
  event.stopPropagation();
});

Це допомагає уникнути небажаних обробок на батьківських елементах, коли подія повинна бути оброблена тільки на певному елементі.

автор: Bond

Порада

Пам'ятайте, що якщо ви створюєте власні події через CustomEvent, ви можете контролювати, чи буде подія спливати, встановлюючи значення bubbles в параметрах події. Це дозволяє створювати події з потрібною поведінкою для конкретних ситуацій.

автор: Bond
Порада

Коли ви працюєте з багаторівневою структурою DOM, важливо враховувати, що зупинка спливання на одному елементі впливає на всю ієрархію. Якщо подія не повинна доходити до вищих рівнів, використовуйте stopPropagation(), але будьте обережні, щоб це не порушило інші обробники.

автор: Bond
Порада

Використовуйте bubbles у поєднанні з делегуванням подій. Якщо у вас є список елементів, де кожен елемент повинен реагувати на подію, краще призначати один обробник на батьківський елемент і перевіряти подію через спливання:

document.querySelector('.parent').addEventListener('click', (event) => {
  if (event.bubbles && event.target.matches('.child')) {
    // Обробляємо подію на дитячому елементі
  }
});
автор: Bond

Синтаксис

event.bubbles

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
1 1.5 1 ≤12.1 12 9
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
4.4 18 4 1
Підтримка: серверні переглядачі
Переглядач Node.js Deno
14.5.0 1.0

Приклади

+ запропонувати свій приклад у пісочниці

У цьому прикладі подія click відслідковується на батьківському елементі .parent, але якщо цільовий елемент має клас no-bubble, спливання події буде зупинено. Це дозволяє обробляти події тільки на певних елементах, не даючи їм впливати на інші рівні DOM.

HTML

<div class="parent">перший елемент parent</div>
<div class="parent">другий елемент parent</div>

JS

document.querySelector('.parent').addEventListener('click', (event) => {
  if (event.target.classList.contains('no-bubble')) {
    event.stopPropagation();
    console.log('Спливання зупинено для елемента:', event.target);
  }
});
автор: Bond

У цьому прикладі створюється кастомна подія з використанням CustomEvent, яка спливає від дочірнього елемента до тіла документа. Завдяки властивості bubbles: true, подія може бути відловлена на будь-якому рівні DOM, надаючи можливість ділитися даними між різними частинами сторінки.

HTML

<div class="child">перший елемент child</div>
<div class="child">другий елемент child</div>

JS

let customEvent = new CustomEvent('customEvent', {
  bubbles: true, 
  detail: { message: 'Привіт від CustomEvent!' }
});

document.querySelector('.child').dispatchEvent(customEvent);

document.body.addEventListener('customEvent', (event) => {
  console.log(event.detail.message); // "Привіт від CustomEvent!"
});
автор: Bond

У цьому прикладі є два елементи-кнопки. Кнопка "Натисни мене (спливання)" дозволяє події спливати до батьківського елемента, і подія обробляється як на кнопці, так і на контейнері. Інша кнопка "Натисни мене (без спливання)" зупиняє спливання події, і вона обробляється лише на самій кнопці, без впливу на контейнер. Користувач може побачити, як властивість bubbles впливає на обробку подій у DOM.

автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід