在MVVM框架中,一是监听数据变化,数据驱动。html
当咱们,经过JS操做了DOM以后,咱们须要通知到DOM来更新视图。在VUE中,是维护了一个异步的队列。并非你修改了DOM就会直接更新到视图上面。数组
以上三种都不是很好的方法。那么,咱们今天来介绍一下,如今比较经常使用的:浏览器
Mutation Observer API 用来监视 DOM 变更。DOM 的任何变更,好比节点的增减、属性的变更、文本内容的变更,这个 API 均可以获得通知。 Mutation Observer 则是异步触发,DOM 的变更并不会立刻触发,而是要等到当前全部 DOM 操做都结束才触发。 这样设计是为了应付 DOM变更频繁的特色。app
举例来讲,若是文档中连续插入1000个li元素,就会连续触发1000个插入事件,执行每一个事件的回调函数,这极可能形成浏览器的卡顿;而 Mutation Observer 彻底不一样,只在 1000 个段落都插入结束后才会触发,并且只触发一次。框架
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的callback回调函数是异步的,只有在所有DOM操做完成以后才会调用callback。异步
<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 均可以派上用场。例如:函数