PerformanceEventTiming - 提供了多个事件类型的计时信息
PerformanceEventTiming
是事件计时 API 的接口,提供以下事件类型的计时信息。
auxclick
beforeinput
click
compositionend
compositionstart
compositionupdate
contextmenu
dblclick
dragend
dragenter
dragleave
dragover
dragstart
drop
input
keydown
keypress
keyup
mousedown
mouseenter
mouseleave
mouseout
mouseover
mouseup
pointerover
pointerenter
pointerdown
pointerup
pointercancel
pointerout
pointerleave
gotpointercapture
lostpointercapture
touchstart
touchend
touchcancel
属性
PerformanceEventTiming.processingStart
返回事件调度开始的时间。
PerformanceEventTiming.processingEnd
返回事件分发结束的时间。
PerformanceEventTiming.cancelable
返回关联事件的 cancelable
属性。
PerformanceEventTiming.target
返回关联事件的最后一个目标(如果未删除)。
方法
PerformanceEventTiming.toJSON()
将 PerformanceEventTiming
对象转换为 JSON。
实例
以下实例显示了如何对所有事件使用 API:
const observer = new PerformanceObserver(function(list) {
const perfEntries = list.getEntries().forEach(entry => {
// 全程
const inputDuration = entry.duration;
// 输入延迟(处理事件之前)
const inputDelay = entry.processingStart - entry.startTime;
// 同步事件处理时间(在开始和结束分发之间)。
const inputSyncProcessingTime = entry.processingEnd - entry.processingStart;
});
});
// 注册事件观察者。
observer.observe({entryTypes: ["event"]});
我们还可以直接查询首次输入延迟。第一个输入延迟(或称为 FID),用于衡量从用户首次与页面进行交互(即当他们单击链接或点击按钮时)到浏览器实际能够开始处理事件处理程序来响应交互的时间。
// 跟踪是否(以及何时)首次隐藏页面,请参见:
// https://github.com/w3c/page-visibility/issues/29
// 注意:理想情况下,此检查将在文档中的 <head> 执行以避免在此代码运行之前可见性状态发生更改。
let firstHiddenTime = document.visibilityState === 'hidden' ? 0 : Infinity;
document.addEventListener('visibilitychange', (event) => {
firstHiddenTime = Math.min(firstHiddenTime, event.timeStamp);
}, {once: true});
// 将传递的数据发送到分析端点。这段代码发送到 `/analytics`;您可以将其替换为自己的网址。
function sendToAnalytics(data) {
const body = JSON.stringify(data);
// 如果可用,使用 `navigator.sendBeacon()` ,否则回退到 `fetch()`。
(navigator.sendBeacon && navigator.sendBeacon('/analytics', body)) ||
fetch('/analytics', {body, method: 'POST', keepalive: true});
}
// 使用 try / catch 而不是检测是否支持 `first-input` 功能,
// 因为某些浏览器在使用新的 `type` 选项时会抛出异常。
// https://bugs.webkit.org/show_bug.cgi?id=209216
try {
function onFirstInputEntry(entry) {
// 如果在分派条目之前未隐藏页面,则仅报告 FID。当页面在后台选项卡中加载时,通常会发生这种情况。
if (entry.startTime < firstHiddenTime) {
const fid = entry.processingStart - entry.startTime;
// 将 FID 值报告给分析端点。
sendToAnalytics({fid});
}
}
// 创建一个 `PerformanceObserver`,为每个条目调用 `onFirstInputEntry`。
const po = new PerformanceObserver((entryList) => {
entryList.getEntries().forEach(onFirstInputEntry);
});
// 观察 `first-input` 类型的条目,包括缓冲条目,即在调用下面的 `observe()` 之前发生的条目。
po.observe({
type: 'first-input',
buffered: true,
});
} catch (e) {
// 如果浏览器不支持此 API,则什么也不做。
}
规范
规范 | 状态 | 备注 |
---|---|---|
Event Timing API PerformanceEventTiming 的定义 |
编者的草案 | 初始定义。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 77 | 80 | 不支持 | 不支持 | 支持 | 不支持 |
cancelable | 77 | 80 | 不支持 | 不支持 | 支持 | 不支持 |
processingEnd | 77 | 80 | 不支持 | 不支持 | 支持 | 不支持 |
processingStart | 77 | 80 | 不支持 | 不支持 | 支持 | 不支持 |
toJSON | 77 | 80 | 不支持 | 不支持 | 支持 | 不支持 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 77 | 77 | 未知 | 不支持 | 未知 | 支持 | 不支持 |
cancelable | 77 | 77 | 未知 | 不支持 | 未知 | 支持 | 不支持 |
processingEnd | 77 | 77 | 未知 | 不支持 | 未知 | 支持 | 不支持 |
processingStart | 77 | 77 | 未知 | 不支持 | 未知 | 支持 | 不支持 |
toJSON | 77 | 77 | 未知 | 不支持 | 未知 | 支持 | 不支持 |