MutationObserver
MutationObserver
给开发者们提供了一种能在某个范围内的DOM树发生变化时作出适当反应的能力.该API设计用来替换掉在DOM3事件规范中引入的Mutation事件.
构造函数
MutationObserver()
该构造函数用来实例化一个新的Mutation观察者对象.
MutationObserver(
function callback
);
参数
callback
MutationRecord
对象的数组,第二个参数则是这个观察者对象本身.实例方法
void observe( |
void disconnect(); |
Array takeRecords(); |
observe()
给当前观察者对象注册需要观察的目标节点,在目标节点(还可以同时观察其后代节点)发生DOM变化时收到通知.
void observe(
Node target,
optional MutationObserverInit options
);
参数
target
options
MutationObserverInit
对象,指定要观察的DOM变化类型.disconnect()
让该观察者对象停止观察指定目标的DOM变化.直到再次调用其observe()
方法,该观察者对象包含的回调函数都不会再被调用.
void disconnect();
takeRecords()
清空观察者对象的
记录队列,并返回里面的内容.
Array takeRecords();
返回值
返回一个包含了MutationRecord
s对象的数组.
MutationObserverInit
MutationObserverInit是一个用来配置观察者对象行为的对象,该对象可以拥有下面这些属性
:
childList
, attributes
, 或者characterData
三个属性中必须至少有一个为true
.否则,会抛出异常"An invalid or illegal string was specified".属性 | 描述 |
childList |
如果需要观察目标节点的子节点(新增了某个子节点,或者移除了某个子节点),则设置为true . |
attributes |
如果需要观察目标节点的属性节点(新增或删除了某个属性,以及某个属性的属性值发生了变化),则设置为true . |
characterData |
如果目标节点为characterData节点(一种抽象接口,具体可以为文本节点 ,注释节点,以及处理指令节点) 时,也要观察该节点的文本内容是否发生变化,则设置为true . |
subtree |
除了目标节点,如果还需要观察目标节点的所有后代节点(观察目标节点所包含的整棵DOM树上的上述三种节点变化),则设置为true . |
attributeOldValue |
在 |
characterDataOldValue |
在characterData 属性已经设为true的前提下,如果需要将发生变化的 characterData 节点之前的 文本内容记录下来(记录到下面MutationRecord对象的oldValue属性中),则设置为true . |
attributeFilter |
一个属性名数组(不需要指定命名空间),只有该数组中包含的属性名发生变化时才会被观察到,其他名称的属性发生变化后会被忽略. |
MutationRecord
MutationRecord
对象会作为第一个参数传递给观察者对象包含的回调函数,该对象有下面这些属性:
属性 | 类型 | 描述 |
type |
String |
如果是属性发生变化,则返回attributes .如果是一个CharacterData 节点发生变化,则返回characterData ,如果是目标节点的某个子节点发生了变化,则返回childList.
|
target |
|
返回此次变化影响到的节点,具体返回那种节点类型是根据type值的不同而不同的 . 如果type 为attributes ,则返回发生变化的属性节点所在的元素节点,如果type 值为characterData ,则返回发生变化的这个characterData 节点.如果type 为childList ,则返回发生变化的子节点的父节点. |
addedNodes |
|
返回被添加的节点,或者为null . |
removedNodes |
|
返回被删除的节点,或者为null . |
previousSibling |
|
返回被添加或被删除的节点的前一个兄弟节点,或者为null . |
nextSibling |
|
返回被添加或被删除的节点的后一个兄弟节点,或者为null . |
attributeName |
String |
返回变更属性的本地名称,或者为null . |
attributeNamespace |
String |
返回变更属性的命名空间,或者为null . |
oldValue |
String |
根据 |
例子
下面的例子来自这篇博文.
// Firefox和Chrome早期版本中带有前缀 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver // 选择目标节点 var target = document.querySelector('#some-id'); // 创建观察者对象 var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { console.log(mutation.type); }); }); // 配置观察选项: var config = { attributes: true, childList: true, characterData: true } // 传入目标节点和观察选项 observer.observe(target, config); // 随后,你还可以停止观察 observer.disconnect();
假设target
为当前文档中某个已知的节点,observer
为某个已经实例化的MutationObserver
观察者对象,则:
observer.observe(target, {childList:true}) //childList属性只观察子节点的新建与删除,子节点本身的任何变化都不会去理会 target.appendChild(document.createElement("div")) //添加了一个元素子节点,触发回调函数. target.appendChild(document.createTextNode("foo")) //添加了一个文本子节点,触发回调函数. target.removeChild(target.childNodes[0]) //移除第一个子节点,触发回调函数. target.childNodes[0].appendChild(document.createElement("div")) //为第一个子节点添加一个子节点,不会触发回调函数,如果需要触发,则需要设置subtree属性为true. observer.observe(target, {childList:true,subtree:true}) //subtree属性让观察行为进行"递归",这时,以target节点为根节点的整棵DOM树发生的变化都可能会被观察到 observer.observe(document, {childList:true,subtree:true}) //如果target为document或者document.documentElement,则当前文档中所有的节点添加与删除操作都会被观察到 observer.observe(document, {childList:true,attributes:true,characterData:true,subtree:true}) //当前文档中几乎所有类型的节点变化都会被观察到(包括属性节点的变化和文本节点的变化等) observer.observe(target, {childList:true}) //假设此时target的outHTML内容为<div>foo<div>,则: target.childNodes[0].data = "bar" //不会触发回调函数,因为childList只观察节点的新建与删除,而这里target节点的子节点仍然只有一个,没有多,没有少 observer.observe(target, {childList:true,characterData:true}) //加上characterData属性,允许观察文本节点的变化,行不行? target.childNodes[0].data = "bar" //还是不会触发回调函数,因为发生变化的是target节点的子节点,我们目前的目标节点只有一个,就是target. observer.observe(target, {childList:true,characterData:true,subtree:true}) //加上subtree属性,观察所有后代节点 target.childNodes[0].data = "bar" //触发了回调函数,发生变化的是target节点的文本子节点(必须同时有characterData和subtree属性,才能观察到一个元素目标节点里的文本内容的变化) observer.observe(target, {attributes:true}) //只观察目标节点的属性节点 target.setAttribute("foo","bar") //不管foo属性存在不存在,都会触发回调函数 target.setAttribute("foo","bar") //即使前后两次的属性值一样,还是会触发回调函数 target.removeAttribute("foo") //移除foo属性节点,触发回调函数 target.removeAttribute("foo") //不会触发回调函数,因为已经没有属性节点可移除了 observer.observe(target, {attributes:true,attributeFilter:["bar"]}) //指定要观察的属性名 target.setAttribute("foo","bar") //不会触发回调函数,因为attributeFilter数组不包含"foo" target.setAttribute("bar","foo") //触发了回调函数,因为attributeFilter数组包含了"bar"
refer to https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver
相关推荐
MutationObserver是JavaScript中用于观察DOM树变化的一个强大API。它的工作原理是监控指定DOM节点及其子节点,当这些节点发生添加、删除、属性修改等变化时,MutationObserver会捕获这些变化并将其作为...
代码实现了前进和后退功能,所有元素下的元素变动都会被插件记录下来。
MutationObserver 是 JavaScript 中一个强大的工具,用于监听 DOM 树的变化。在前端开发中,DOM 操作往往是性能的关键因素,特别是那些可能导致页面回流 (reflow) 和重绘 (repaint) 的操作,它们会严重影响用户体验...
使用MutationObserver的DOM元素的加载/卸载事件 用法 var onload = require ( 'on-load' ) var div = document . createElement ( 'div' ) onload ( div , function ( el ) { console . log ( 'in the dom' ) } , ...
通过MutationObserver观察一个突变,然后解决一个Promise。 安装 npm install one-mutation // This module is only offered as a ES Module import oneMutation from 'one-mutation' ; 用法 oneMutation ( ...
TypeError: Failed to execute ‘observe’ on ‘MutationObserver’: parameter 1 is not of type ‘Node’ InfiniteScroll的更多用法element官网 二、解决办法 给需要使用 InfiniteScroll 的元素或者它的父级...
集成聚合物原始仓库突变观察者突变观察者 Polyfill 这使用 MutationEvents 来实现 MutationObserves,因此您至少需要 IE9。 IE11、Firefox、Chrome 和 Opera 都原生支持 MutationObservers。
MutationObserver断开/连接的帮助程序。 import { notify } from 'element-notifier' ; const observer = notify ( ( element , connected ) => { if ( connected ) console . log ( element , 'has been ...
QuerySelectorObserver 100%受Daniel的黑客启发,该模块带来了友好的MutationObserver(如API)来观察CSS选择器。 const so = new QuerySelectorObserver(records => {for(reco QuerySelectorObserver的const记录...
修饰符支持MutationObserver#observe支持的所有配置选项。 在以下示例中,通过观察some-attr属性的更改,只要在div上更改this.onChange就会调用this.someAttrValue 。 < div some-attr = {{ this....
MutationObserver介绍 MutationObserver给开发者们提供了一种能在某个范围内的DOM树发生变化时作出适当反应的能力.该API设计用来替换掉在DOM3事件规范中引入的Mutation事件. Mutation Observer(变动观察器)是监视...
MutationObserver启发了自定义元素的观察者,例如任何DOM元素上的突变。 import ElementObserver from '@webreflection/element-observer' ; const observer = new ElementObserver ( { // optional, used only if...
② 掌握MutationObserver和requestAnimationFrame等DOM操作工具;③ 提升代码质量,编写更高效、可维护的应用程序。 其他说明:书籍内容丰富,覆盖了从基础到高级的主题,适合自学和团队培训。阅读过程中应结合代码...
因为它是IE特有的,而在其他遵循W3C标准的浏览器(如Firefox、Chrome、Safari和Opera)中,推荐使用`addEventListener`或`attachEvent`来监听属性变化,通常通过`MutationObserver`接口实现。 `onpropertychange`...
这个功能是基于MutationObserver API的扩展,它可以帮助我们跟踪DOM元素的矩形(Rect)变化,而无需频繁地进行手动计算。这在创建响应式布局、动画或者需要精确控制元素位置的场景中非常有用。 `observe-rect`通常...
基于CasperJS和PhantomJS,可以自动渲染...但是文章中说PhantomJS不支持MutationObserver是错误的,实际上从PhantomJS 2.0开始就已经添加了对MutationObserver的支持。 更多详情、使用方法,请下载后阅读README.md文件
2. `MutationObserver`的回调:用于监听DOM变化的API。 在JavaScript执行的过程中,引擎首先会执行所有同步代码,包括函数调用、变量赋值等。当遇到异步任务时,它不会立即执行,而是将其放入对应的队列中。执行...
在选择替代的Mutation Observer polyfill时,可以考虑如"mutationobserver-shim"这样的库,它是经过广泛测试和维护的,能提供与原生Mutation Observer接口一致的兼容性。在使用任何polyfill时,都要确保其与项目中的...