addedNodes
- это коллекция NodeList.Вы можете достичь чего-то, почти идентичного querySelectorAll
, вызвав на него Array.prototype.filter
, где обратный вызов проверяет, передал ли данный элемент .matches
селектор:
new MutationObserver((mutationsList) => {
const { addedNodes } = mutationsList[0];
const matches = [...addedNodes]
.filter(node => node.nodeType === 1)
.filter(element => element.matches('.someDiv'));
if (matches.length) {
console.log(matches);
}
})
.observe(document.body, { childList: true });
setTimeout(() => {
document.body.insertAdjacentHTML(
'beforeend',
`<div class="someDiv">dynamically added matching</div>
<div class="nonMatching">dynamically added non-matching</div>`
);
}, 1000);
<div class="somediv">existing</div>
Просто замените строку селектора, переданную в .matches
, любой строкой селектора, по которой вы хотите фильтровать.
Если вы хотите проверить, любые дочерние элементы addedNodes
соответствуют селектору, а не только самим addedNodes
, вы можете использовать что-то вроде flatMap
, чтобы извлечь массив подстрок из каждого элемента, если вы хотите:
new MutationObserver((mutationsList) => {
const { addedNodes } = mutationsList[0];
const elements = [...addedNodes]
.filter(node => node.nodeType === 1);
const matches = [
...elements.filter(element => element.matches('.someDiv')),
...elements.flatMap(element => [...element.querySelectorAll('.someDiv')])
];
if (matches.length) {
console.log(matches);
}
})
.observe(document.body, { childList: true });
setTimeout(() => {
document.body.insertAdjacentHTML(
'beforeend',
`<div class="someDiv">dynamically added matching
<div class="someDiv">dynamically added matching nested</div>
</div>
<div class="nonMatching">dynamically added non-matching</div>`
);
}, 1000);
<div class="somediv">existing</div>