предисловие
В структуре MVVM первым является отслеживание изменений данных на основе данных.
- Все мы знаем, что можем прослушивать изменения данных через Object.defineProperties() или использовать прокси и отражение.
- На самом деле в MVVM тоже есть сценарии для манипулирования DOM. Итак, какие API мы используем для мониторинга изменений DOM?
Когда мы манипулируем DOM через JS, нам нужно уведомить DOM об обновлении представления. В VUE поддерживается асинхронная очередь. Дело не в том, что вы изменяете DOM, и он обновляется непосредственно в представлении.
Как отслеживать изменения DOM:
- голосование
- MutationEvents (в основном устарело)
- CSS-анимация
Ни один из трех вышеперечисленных методов не является очень хорошим. Итак, давайте сегодня познакомим вас с наиболее часто используемыми:
- MutationObserver
Мы выбираем Mutation Observer
Обзор
API Mutation Observer используется для отслеживания изменений DOM. Этот API может уведомлять о любых изменениях в DOM, таких как увеличение или уменьшение узлов, изменения атрибутов и изменения текстового содержимого. Mutation Observer запускается асинхронно, изменения DOM не будут срабатывать немедленно, но не будут срабатывать до тех пор, пока не будут завершены все текущие операции с DOM. Этот дизайн должен справиться с частыми изменениями DOM.
Например, если в документ непрерывно вставляется 1000 элементов li, будет непрерывно срабатывать 1000 событий вставки, и будет выполняться callback-функция каждого события, что, скорее всего, приведет к зависанию браузера, тогда как Mutation Observer совершенно другой. , only in 1000 Он сработает только после вставки всех абзацев и только один раз.
Mutation Observer имеет следующие особенности:
- Ожидание завершения всех задач сценария перед запуском, то есть асинхронно.
- Инкапсулируйте запись изменения DOM в массив для обработки вместо обработки изменений DOM по одному.
- То есть вы можете наблюдать за всеми изменениями, происходящими в DOM-узлах, либо можете наблюдать за определенным типом изменений
использовать
var observe = new MutationObserver(function(mutations, observer){
});
var el = document.querySelector('#app');
var options = {
'childList': true,
'attributes':true
} ;
observer.observe(el, options);
// 创建并返回一个 MutationObserver 实例, 并侦听el元素的变动。
небольшой пример
Функция обратного вызова MutationObserver является асинхронной, и обратный вызов будет вызываться только после завершения всех операций DOM.
<div id='target' class='block' name='target'>
target的第一个子节点
<p>
<span>target的后代</span>
</p>
</div>
var target=document.getElementById('target');
var i=0
var observe=new MutationObserver(function (mutations,observe) {
i++
});
observe.observe(target,{ childList: true});
target.appendChild(docuemnt.createTextNode('1'));
target.appendChild(docuemnt.createTextNode('2'));
target.appendChild(docuemnt.createTextNode('3'));
console.log(i) //1 callback的回调次数
заявление
Есть много ситуаций, когда MutationObserver API может пригодиться. Например:
- Вы хотите уведомить посетителя веб-приложения, что что-то изменилось на странице, на которой он сейчас находится.
- Вы разрабатываете новую среду JavaScript и вам необходимо динамически загружать модули JavaScript на основе изменений в модели DOM.
совместимость
Глядя на комментарии, я больше обеспокоен совместимостью, и я опубликую это здесь. Вы также можете пойти на MDN для просмотра напрямую
Суммировать
- Интерфейс MutationObserver предоставляет возможность отслеживать изменения, внесенные в дерево DOM. Он был разработан как замена старой функции Mutation Events, которая была частью спецификации DOM3 Events. (МДН)
- DOM MutationObserver, который реагирует на изменения DOM, не влияя на производительность браузера.
- Ожидание завершения всех задач сценария перед запуском, то есть асинхронно.