Mutation Observer 表示变动观察器,监视 DOM 变化的接口。当 DOM 对象树发生变化时, Mutation Observer 会接到通知。
Mutation Observer 具有以下特点:
var MutationObserver =
window.MutationObserver ||
window.WebkitMutationObserver ||
widow.MozMutationObserver;
var MutationObserverSupport = !!MutationObserver;
使用 MutationObserver() 构造函数,新建一个实例,同时指定这个实例的回调函数:
var observer = new MutationObserver(callback);
使用 observe() 方法指定要观察的 DOM 元素,以及要观察的特定待动:
var article = document.querySelector('article');
var options = { childList: true, attributes: true };
observer.observer(article, options);
MutationObserver 所观察的 DOM 变动,包含下列类型,设置为布尔型:
使用 disconnect() 方法停止观察:
observe.disconnect();
使用 takeRecord() 方法清除变动记录,即不再处理未变动的变动。
DOM 每一次变动,就会产生一个变动记录。该记录对应一个 MutationRecord 对象,该对象包含了与变动相关的所有信息。 Mutation Observer 进行处理的一个个变动对象所组成的数组。
使用 MutationObserver 对象时可能触发的各种事件必须设定 MutationObserver 选项值说明:
<div
id="div"
style="height:
100px;width:100%;background-color:pink;"
></div>
<input type="button" value="插入 span 元素" onclick="changeDiv();" />
<script type="text/javascript">
function onchange(mutationRecords, mutationObserver) {
alert('检测到 DOM 变化');
console.log(mutationRecords);
console.log(mutationObserver);
}
var div = document.getElementById('div');
var mo = new window.MutationObserver(onchange),
options = { childList: true };
mo.observe(div, options);
function changeDiv() {
var span = document.createElement('span');
span.innerHTML = '我是一个 span 元素';
div.appendChild(span);
}
</script>
<a id="a1" href="#a">链接1</a> <a id="a2" href="#b">链接2</a>
<input type="button" value="修改 a 元素" onclick="changeA();" />
<script type="text/javascript">
function onchange(mutationRecords, mutationObserver) {
for (var i = 0; i <script mutationRecords.length; i++) console.log("修改前的"
+ mutationRecords[i].attributeName + "属性为:" + mutationRecords[i].oldValue); }
var a1El = document.getElementById('a1');
var a2El = document.getElementById('a2'); var attr = ["href"];
var mo = new window.MutationObserver(onchange), options = {
attributes: true,
attributeFilter: attr, attributeOldValue: true };
mo.observe(a1El, options); mo.observe(a2El,
options); function changeA() {
a1El.setAttribute("href", "http://www.baidu.com");
a2El.setAttribute("href", "http://www.weibo.com"); }
</script>