Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Установка наблюдателя MutationObserver (https://javascript.ru/forum/events/80974-ustanovka-nablyudatelya-mutationobserver.html)

DDim1000 05.09.2020 10:31

Установка наблюдателя MutationObserver
 
Здравствуйте!
Подскажите, пожалуйста,.. возникло несколько вопросов по ниже приведенному коду.
Нужно отследить появления элемента...
Вопрос:
Здесь указываем тот элемент, в котором ожидаем появления нужного нам элемента, или тот элемент, появления которого мы ожидаем?: document.querySelector('#some-id');

// выбираем нужный элемент для наблюдения
var target = document.querySelector('#some-id');

// если jQuery
var target = $('#some-id')[0];
 
// создаем новый экземпляр наблюдателя
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });    
});
 
// создаем конфигурации для наблюдателя
var config = { attributes: true, childList: true, characterData: true };
 
// запускаем механизм наблюдения
observer.observe(target,  config);
 
// позже, если надо, прекращаем наблюдение
observer.disconnect();

рони 05.09.2020 10:59

Цитата:

Сообщение от DDim1000
Здесь указываем тот элемент, в котором ожидаем появления нужного нам элемента,

Цитата:

Сообщение от DDim1000
childList: true,

:-?

Nexus 05.09.2020 11:10

Цитата:

target - A DOM Node (which may be an Element) within the DOM tree to watch for changes, or to be the root of a subtree of nodes to be watched.
Т.е. target - это элемент, за которым Observer будет наблюдать.

DDim1000 05.09.2020 11:28

А mutations.forEach(function(mutation)({}) что делает? При каждом изменении DOM ищет тот элемент, за которым установлено наблюдение?

рони 05.09.2020 14:16

:-?
Цитата:

Сообщение от DDim1000
что делает?

Цитата:

Сообщение от DDim1000
attributes: true, childList: true, characterData: true


DDim1000 26.09.2020 22:28

Подскажите, пожалуйста, почему ошибка?: Uncaught NotFoundError: Failed to execute 'observe' on 'MutationObserver': The provided node was null
// выбираем элемент, который должен появится в DOM
               var target = document.querySelector("#message-list");

function track_send(){
              
	var observer = new MutationObserver(function(mutations) { 
		mutations.forEach(function(mutation) {
                                               alert("Сработало!");  
                                    
		});
	});

	var config = { attributes: true, childList: true, characterData: true };

	observer.observe(target, config);
           
}

 $("div[data-name='send']").click(function(){
        track_send();
       //.............
});

рони 26.09.2020 23:31

Цитата:

Сообщение от DDim1000
выбираем элемент, который должен появится в DOM

фантастика! как можно выбрать, то чего нет?

DDim1000 27.09.2020 11:33

Не понял. Тогда, нужно проверку что ли ставить? А иначе, как узнать то, что появился на страницы именно тот элемент, который нужен?
Как мне узнать, когда на странице появится $('div#some-id'); ???

Nexus 27.09.2020 13:29

DDim1000, установите слушателя на родительский элемент относительно вашего div#some-id и слушайте изменения детей.

DDim1000 28.09.2020 15:04

Что-то у меня не получается.... Посмотрите, пожалуйста, код: https://jsfiddle.net/z9q3kn6w/1/

voraa 28.09.2020 15:30

Вы наблюдатель ставите на элемент, который еще не существует.

var target = document.querySelector(".pkujhh > #mess"); // null !!!
observer.observe(target, config);

Нет его еще. Он только будет когда то создан и вставлен в body.

Наблюдатель ставят на элемент, В который будут что то вставлять.

DDim1000 28.09.2020 15:38

Цитата:

Сообщение от voraa (Сообщение 529301)
....
Наблюдатель ставят на элемент, В который будут что то вставлять.

А откуда я тогда узнаю, что появился именно тот элемент, появления которого я хочу отследить?

voraa 28.09.2020 15:42

Просматриваете все мутации
Если тип нужный (MutationRecord.type === "childList"), то в MutationRecord.addedNodes будет коллекция вставленных узлов. Перебираете ее и смотрите тот узел или не тот. По id или с помощью matches
https://developer.mozilla.org/en-US/...MutationRecord

var observer = new MutationObserver(function(mutations) { 
		mutations.forEach(function(mutation) {
                 if ( mutation.type ===  'childList')    {
                     mutation.addedNodes.forEach (addn => {
                             if (addn.id === 'mess') console.log('YES!!!')
                       })
                 }                         
		});
	});

var config = { attributes: true, childList: true, characterData: true };

	observer.observe(document.body, config);


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