web api - mutationObserver

本文解析MutationObserver如何监听DOM变化,以及PerformanceObserver如何监测性能指标。通过实例演示了这两个API的使用和关键属性,帮助开发者提升网页性能和DOM管理效率。

MutationObserver接口提供了监听对DOM树所做更改的能力。是DOM3 Events规范的一部分。

构造函数

MutationObserver()
创建并返回一个新的MutationObserver,它会在指定DOM发生变化时被调用。

方法

  • disconnect()
    阻止MutationObserver实例继续接收通知,直到再次调用其observe()方法,该观察者对象包含的回调函数都不会被调用
  • observe()
    配置MutationObserver在Dom更改匹配给定选项时,通过其回调函数开始接收通知
  • takeRecords()
    从MutationObserver的通知队列中删除所有待处理的通知,并将它们返回到MutationRecord对象的新Array中

示例

// 需要观察变动的DOM节点
const targetNode = document.getElementById('some-id')

// 观察器的配置,需要监听的属性
const config = {attributes: true, childList: true, subtree: true }

// 当观察到变动时执行的回调函数
const callback = function(mutationList, observer) {
	for (let mutation of mutationList) {
		if (mutation.type === 'childList') {
			console.log('A Children node has been added or removed')
		} else if (mutation.type === 'attributes') {
			console.log('The' + mutation.attributeName + ' attribute was modified. ')
		}
	}
}

// 创建一个观察器实例并传入回调函数
const observer = new MutationObserver(callback)

// 观察目标节点变动
observer.observe(targetNode, config)

// 停止观察
observer.disconnect()

性能监测对象

PerformanceObserver用于监测性能度量事件,在浏览器的性能时间轴记录下一个新的Performance entries的时候将会被通知

构造函数

PerformanceObserver()

方法
  • PerformanceObserver.observe()
    指定监测的entry types集合。当performance entry被记录且是指定的entryTypes之一时,性能观察者对象的回调函数会被调用
  • PerformanceObserver.disconnect()
    性能监测回调停止接收
示例
var observer = new PerformanceObserver( (list, obj) => {
	const entries  = list.getEntries()
	for ( let i = 0; i < entries.length; i++) {
		// process 'mark' and 'frame' events
	}
} )
observer.observe({entryTypes: ['mark', 'frame']})


var observer2 = new PerformanceObserver((list, observer) => {
	// process the measure envent
})

observer2.observe({entryTypes: ['measure']})

Performance对象

高精度时间(High Resolution Time简称 hr-time)规范定义了Performance对象,通过Performance对象我们可以获得高精度时间

方法和属性
  • 属性:timeOrigin
    timeOrigin返回页面浏览上下文第一次被创建的时间。如果全局对象为WorkerGlobalScope,则timeOrigin为Worker被创建的事件.

    timeOrigin的时间值不受时钟偏差与系统时钟调整的影响
    
    new Date(performance.timeOrigin).toLocaleString()     // "2021/4/6下午2:22:03"
    
    当timeOrigin的值被确定后,无论将系统时间设置到什么时间,performance.timeOrigin值不变
    
  • 方法:now()
    方法now被执行后会返回从timeOrigin到现在的高时间精度

    performance.now() =  当前时间  - performance.timeOrigin 
    
    new Date(performance.timeOrigin + performance.now()).toLocaleString()
    // "2021/4/6下午5:10:55"
    
  • getEntries()

  • getEntriesByType()

    window.performance.getEntriesByType('resource')
    

类型为resource的PerformanceEntry对象在术语上被称为PerformanceResourceTiming对象

  • getEntriesByName()

PerformanceResourceTiming对象扩展了PerformanceEntry对象并新增了很多属性用于获取详细的资源计时信息,PerformanceResourceTiming对象的属性如下:

属性名作用
name请求资源的绝对地址,即便请求重定向到一个新的地址,此属性也不会改变
entryTypePerformanceResourceTiming对象的entryType属性永远返回字符串“resource”
startTime用户代理开始排队获取资源的时间。如果HTTP重定向则该属性与redirectStart属性相同,其他情况该属性将与fetchStart相同
duration该属性将返回 responseEnd 与 startTime之间的时间
initiatorType发起资源的类型
nextHopProtocol请求资源的网络协议
workerStart如果当前上下文是”worker”,则workerStart属性返回开始获取资源的时间,否则返回0
redirectStart资源开始重定向的时间,如果没有重定向则返回0
redirectEnd资源重定向结束的时间,如果没有重定向则返回0
fetchStart开始获取资源的事件,如果资源充电箱了,则时间为最后一个重定向资源的开始获取时间
domainLookupStart资源开始进行DNS查询的时间(如果无DNS查询,如使用缓存或本地资源则时间等于fetchStart)
domainLookupEnd资源完成DNS查询时间(如无DNS查询,如使用了缓存或本地资源,则时间等于fetchStart)
connectStart用户代理开始与服务器建立用来检索资源的连接的时间(TCP建立连接的时间)
connectEnd用户代理完成与服务器建立的用来检索资源的连接的时间(TCP连接成功的时间)
secureConnectionStart如资源使用安全传输,那么用户代理会启动握手过程以确保当前连接。该属性代表握手开始时间(如果页面使用HTTPS那么值是安全连接握手之前的时间)
requestStart开始请求资源的时间
responseStart用户代理开始接收Response信息的时间(开始接受Response的第一个字节,例如HTTP/2的帧头或HTTP/1.x的Response状态行)
responseEnd用户代理接收到资源的最后一个字节的时间,或在传输连接关闭之前的时间,使用先到者的时间。或者是由于网络错误而终止网络的时间
transferSize表示资源的大小(以八位字节为单位),该大小包括响应头字段和响应有效内容主体(Payload Body)
encodedBodySize表示从HTTP网络或缓存中接收到的有效内容主体(Payload Body)的大小(在删除所有应用内容编码之前)
decodedBodySize表示从HTTP网络或缓存中接收到的消息主体(Message Body)的大小(在删除所有应用内容编码之后)
资源类型initiatorType

initiatorType属性返回的内容代表资源是从哪里发生的请求行为:属性值

类型描述
css请求是从css中的url()指令发出,如 @import url()background: url()
xmlhttprequest通过XMLHttpRequest对象发出的请求
fetch通过fetch方法发出的请求
beacon通过beacon方法发出的请求
link通过link标签发出的请求
script通过script标签发出的请求
iframe通过iframe标签发出的请求
other没有匹配上面条件的请求
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值