Мне интересно, можно ли прослушивать элементы в DOM без использования setInterval, как я делаю это прямо сейчас:
var interval = setInterval(() => {
var div = document.querySelector('.test');
if (div != null) {
clearInterval(interval);
console.info(div);
}
}, 1000);Моя проблема в том, что этот конкретный div загружается в DOM через 10-12 минут случайным образом. И я думаю, что setInterval - просто уродливое решение для этого. Итак, мой вопрос: можно ли вообще прослушивать новые div в DOM без использования интервала?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Этого можно добиться с помощью анимации ключевых кадров CSS.
Javascript:
(function(){
var count = 1,
event = function(event){
if (event.animationName == 'nodeInserted')
event.target.textContent = 'Element ' + count++ + ' has been parsed!';
}
document.addEventListener('animationstart', event, false);
document.addEventListener('MSAnimationStart', event, false);
document.addEventListener('webkitAnimationStart', event, false);
// this is test code which imitates your div being created
// after a delay
setTimeout(function(){
var div = document.createElement('div');
div.setAttribute('class', 'some-control');
document.getElementById('test').appendChild(div)
}, 2000);
})();
CSS:
@keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}
@-moz-keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}
@-webkit-keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}
@-ms-keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}
@-o-keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}
div.some-control {
padding: 50px;
background: #FF6A6A;
animation-duration: 0.01s;
-o-animation-duration: 0.01s;
-ms-animation-duration: 0.01s;
-moz-animation-duration: 0.01s;
-webkit-animation-duration: 0.01s;
animation-name: nodeInserted;
-o-animation-name: nodeInserted;
-ms-animation-name: nodeInserted;
-moz-animation-name: nodeInserted;
-webkit-animation-name: nodeInserted;
}
div.some-control div.some-control {
background: #87CEFF;
}
Кредит: http://www.backalleycoder.com/2012/04/25/i-want-a-damnodeinserted/
@Katamari Это довольно крутой хакер, я тоже его не видел, пока не пытался ответить на этот вопрос.
Кажется, это хорошая работа для Наблюдатель за мутациями. Он будет наблюдать за статическим родителем в вашей DOM и предупреждать вас о любых изменениях в структуре. Вы можете прослушивать дочерний узел с классом test, который будет добавлен. Например:
// this setTimeout is only to show this example working. it is not needed
setTimeout(() => {
let aDiv = document.createElement('div');
aDiv.className = 'test';
document.getElementById('parent').appendChild(aDiv);
}, 3000);
let targetNode = document.getElementById('parent');
let config = {
attributes: false,
childList: true,
subtree: true
};
// Callback function to execute when mutations are observed
let callback = function(mutationsList, observer) {
for (let mutation of mutationsList) {
if (mutation.type == 'childList') {
for (let node of mutation.addedNodes) {
if (node.className === "test") {
console.info("a node with class test was added!");
// stop observing
observer.disconnect();
}
}
}
}
};
// Create an observer instance linked to the callback function
let observer = new MutationObserver(callback);
// Start observing the target node for configured mutations
observer.observe(targetNode, config);<div id = "parent">
</div>
Уверяю вас, что любой другой код для проверки этого элемента DOM будет работать таким же образом