Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   отловить событие изменения странного выпадающего списка (https://javascript.ru/forum/dom-window/85909-otlovit-sobytie-izmeneniya-strannogo-vypadayushhego-spiska.html)

miltorg 10.05.2024 18:45

отловить событие изменения странного выпадающего списка
 
На странице Друпал - есть выпадающий список вариаций товара.
Этот список управляет подзагрузкой Цены, артикула и рис.
Но такое ощущение что он изменяет всю страницу, потому что вот это:

document.addEventListener('DOMContentLoaded', () => {
  let tov = document.querySelector("[id^=edit-product-id");

tov.onchange = function(){alert(55555)};
});


Срабатывает только один раз.

И при повторном выборе выпадающего списка - не происходит ничего.

Как отловить событие изменения такого списка? Спасибо.

voraa 10.05.2024 21:46

Вполне вероятно, что он переписывается каким нибудь innerHTML. Поэтому переменная tov становится недействительной.
Надо как нибудь в devtools в браузере проверять. В отладчике или просматривать элементы (тот же список перед повторным выбором) и смотреть, установлен на нем обработчик или нет.

Отлавливать изменение DOM надо с помощью MutationObserver
https://developer.mozilla.org/ru/doc...tationObserver

miltorg 10.05.2024 22:32

Цитата:

Сообщение от voraa (Сообщение 555317)
Вполне вероятно, что он переписывается каким нибудь innerHTML.

Да. Именно это и происходит. Поэтому я и использовал:

"[id^=edit-product-id]"

miltorg 10.05.2024 22:43

Оно меняет id="edit-product-id---1" на id="edit-product-id---2" и тд.

miltorg 10.05.2024 22:48

Цитата:

Сообщение от voraa (Сообщение 555317)

Отлавливать изменение DOM надо с помощью MutationObserver
https://developer.mozilla.org/ru/doc...tationObserver

https://ru.stackoverflow.com/questio...B5%D0%B3%D0%B0


--- Тут написано что работа с DOM - это тормоза и не во всех браузерах.

Может как то перезагрузить это DOM?

Спасибо

voraa 10.05.2024 23:17

Цитата:

Сообщение от miltorg (Сообщение 555318)
Да. Именно это и происходит. Поэтому я и использовал:

"[id^=edit-product-id]"

Но вы выполняете
let tov = document.querySelector("[id^=edit-product-id");
 
tov.onchange = function(){alert(55555)};

Только один раз, когда страница загрузилась.
Если после этого код поменялся через innerHTML, то это не значит что tov будет указывать на новый элемент и к новому элементу сам ни с того ни с сего прилепится обработчик.

voraa 10.05.2024 23:19

Цитата:

Сообщение от miltorg
--- Тут написано что работа с DOM - это тормоза и не во всех браузерах.

Цитата:

Вопрос задан 8 лет 6 месяцев назад
Нормально все работает

miltorg 10.05.2024 23:49

Цитата:

Сообщение от voraa (Сообщение 555321)
Но вы выполняете
let tov = document.querySelector("[id^=edit-product-id");
 
tov.onchange = function(){alert(55555)};

Только один раз, когда страница загрузилась.
Если после этого код поменялся через innerHTML, то это не значит что tov будет указывать на новый элемент и к новому элементу сам ни с того ни с сего прилепится обработчик.

А как же быть?

miltorg 11.05.2024 01:49

Там подгружаются карты с Яндекса и поэтому MutationObserver срабатывает раз 20 при загрузке и 2 раза - в дальнейшем.

Я вообще в тупике.

Aetae 11.05.2024 04:54

document.addEventListener('change', function(event) {
  var product = event.target.closest('[id^="edit-product-id"]');
  if(!product) return;
  
  alert(55555)
}, true);


Часовой пояс GMT +3, время: 01:27.