振动API测试工具 - 手机马达振动模式调试
使用Vibration API控制设备振动,测试短振、长振和模式振动,验证触觉反馈。
UD5工具箱
检测页面滚动性能,分析被动事件监听器(Passive Event Listener)对滚动流畅度的影响,提供优化建议。
{passive: true}
-- FPS
此区域使用被动事件监听器,浏览器可立即滚动,不受事件处理影响。
{passive: false}
-- FPS
此区域使用非被动事件监听器,浏览器必须等待事件处理完成才能滚动。
复制以下脚本到 Chrome DevTools 控制台 中运行,检测当前页面所有非被动事件监听器。
// 被动事件监听器检测脚本 - 在Chrome DevTools控制台中运行
(function() {
const results = [];
const checked = new Set();
const eventsToCheck = ['wheel', 'touchstart', 'touchmove', 'scroll', 'mousewheel'];
function checkElement(el) {
if (!el || checked.has(el)) return;
checked.add(el);
try {
const listeners = getEventListeners(el);
for (const eventType of eventsToCheck) {
if (listeners[eventType]) {
listeners[eventType].forEach(l => {
results.push({
element: el.tagName + (el.id ? '#' + el.id : '') +
(el.className && typeof el.className === 'string' ?
'.' + el.className.split(' ').filter(Boolean)[0] : ''),
event: eventType,
passive: l.passive !== false,
useCapture: !!l.useCapture,
listenerType: l.type || 'function'
});
});
}
}
} catch(e) {}
}
checkElement(document);
checkElement(window);
document.querySelectorAll('body, body *, #app, #root, main, [id], [class]').forEach(checkElement);
const nonPassive = results.filter(r => !r.passive);
const passive = results.filter(r => r.passive);
console.log('=== 被动事件监听器检测报告 ===');
console.log('共检测到 ' + results.length + ' 个相关事件监听器');
console.log('✅ 被动模式(不影响滚动): ' + passive.length + ' 个');
console.log('⚠️ 非被动模式(可能影响滚动性能): ' + nonPassive.length + ' 个');
if (nonPassive.length > 0) {
console.warn('⚠️ 以下是非被动事件监听器详情:');
console.table(nonPassive);
} else {
console.log('🎉 未发现非被动事件监听器,滚动性能良好!');
}
console.log('---');
console.log('💡 提示:将 wheel/touchstart/touchmove 事件监听器设为 {passive: true} 可提升滚动性能。');
return { total: results.length, passive: passive.length, nonPassive: nonPassive.length, details: results, nonPassiveDetails: nonPassive };
})();
// 非被动模式 - 可能阻塞滚动
element.addEventListener('wheel', function(e) {
// 耗时操作
heavyComputation();
});
// 或者显式设置 passive: false
element.addEventListener('touchmove', handler, { passive: false });
// 被动模式 - 不阻塞滚动
element.addEventListener('wheel', function(e) {
// 耗时操作在后台执行
heavyComputation();
}, { passive: true });
// 对于不需要preventDefault的场景
document.addEventListener('touchstart', handler, { passive: true });
e.preventDefault() 时才设置 {passive: false}touchstart/touchmove 使用被动模式可显著提升滚动流畅度被动事件监听器是浏览器的一项性能优化特性。当事件监听器被标记为 {passive: true} 时,浏览器知道该监听器不会调用 preventDefault(),因此可以立即执行默认行为(如滚动),无需等待JavaScript处理完成。这显著减少了滚动延迟,提升了页面流畅度。
当事件监听器是非被动模式({passive: false} 或未指定且浏览器未默认启用)时,浏览器必须等待事件处理函数执行完毕才能确定是否需要阻止默认行为。如果处理函数中有耗时操作(如复杂计算、DOM操作),主线程被占用,滚动就会被延迟,用户感知为卡顿或掉帧。
主要涉及滚动相关事件:wheel、touchstart、touchmove、scroll(scroll事件本身不阻塞滚动,但频繁触发可能影响性能)。对于不需要阻止默认滚动行为的场景,都应使用 {passive: true}。
是的。Chrome 56+、Firefox 56+、Safari 11+ 已对 touchstart 和 touchmove 事件默认启用被动模式(在document级别)。Chrome 73+ 对 wheel 事件也默认启用。但显式设置 {passive: false} 仍会覆盖默认行为。建议始终显式声明 {passive: true} 以确保最佳性能。
可以使用上方提供的Chrome DevTools控制台脚本进行检测。也可以使用Lighthouse审计工具、Chrome Performance面板录制滚动操作来分析。此外,本工具的测试沙箱可以帮助你直观理解被动与非被动模式的区别。
非常重要。移动端设备的CPU性能通常低于桌面端,且触摸滚动是用户最频繁的交互。非被动模式的 touchstart/touchmove 监听器是移动端滚动卡顿的主要原因之一。启用被动模式可减少约50-80%的滚动延迟,显著改善移动端用户体验。
在被动监听器中调用 e.preventDefault() 会被浏览器忽略(控制台会有警告)。如果确实需要阻止默认行为(如禁止页面缩放、自定义滚动行为),则必须使用 {passive: false}。应谨慎评估是否真的需要阻止默认行为,在大多数情况下不需要。
60 FPS 是流畅滚动的标准(每帧约16.7ms)。低于30 FPS时用户能明显感知卡顿。理想情况下应保持在55-60 FPS。对于120Hz设备,应尽量达到120 FPS,但60 FPS已经是良好的基线。
使用Vibration API控制设备振动,测试短振、长振和模式振动,验证触觉反馈。
拖拽改变一个div的大小,通过ResizeObserver API实时显示其新的宽度和高度。
配置监听目标,实时显示DOM节点的增删改及属性变化,辅助AJAX内容调试。
实时显示当前网络连接状态,监听online/offline事件,帮助用户判断断网原因。
在一个隔离环境中渲染单个组件,调整 props 查看变化,类似于 Storybook 的轻量替代。
配置WebSocket地址,模拟多个并发连接,发送自定义消息并记录响应延迟。
输入对照组和实验组的用户数与转化数,计算 Z 值、P 值,判断是否具有统计显著性。
直观拖拽曲线控制点,生成CSS transition/animation的cubic-bezier()值,并即时播放动画效果预览。
输入源页和引用页URL,构造Webmention请求通知被引用页面,演示独立博客协议。
调节采样频率,观察对正弦波的离散采样和重建效果,演示欠采样导致的频率混叠。
检查XML的格式正确性,报告错误的标签闭合和属性缺失。
输入WebSocket服务地址,建立连接,发送和接收消息,方便调试实时通信应用。
粘贴代码,计算总行数、有效代码行数、注释行数和空行数。
调节两列波的频率、波长和位置,实时观看水面波干涉形成的明暗条纹图案。
在Canvas上绘制理想频率响应,并应用简单FIR滤波器对合成信号进行滤波,听音效对比。
输入两组样本的访问量和转化数,计算P值并判断统计学显著性。
在浏览器中运行完整的SQLite数据库,创建表、插入查询数据,体验客户端强大的SQL能力。
模拟动态区域更新,测试不同aria-live值(polite/assertive)对屏幕阅读器的影响。
输入原始URL,填入来源、媒介、活动名等,生成带UTM规范的推广追踪链接。
设置渐变两端颜色,鼠标滑过渐变条显示任意位置的精确十六进制色。
根据资产、年支出与储蓄率,估算实现财务自由所需的年限与进度条,激发理财动力。
解析Motorola S-Record或Intel HEX格式的固件文件,提取显示原始数据块。
添加二维点并选择核函数,直观展示SVM决策边界与支持向量,理解最大间隔分类原理。
利用预训练的轻量变换网络在浏览器中简单演示将图片转换成特定风格。
字母从极度模糊逐渐变清晰,尽早猜出正确单词获得高分。
粘贴JSON示例数据,自动分析并生成对应的JSON Schema,支持类型推断和必填标记。
生成含不同题材、作者的5x5宾果卡,每读完一本划掉,满一行有奖励。
连接到 WebSocket 端点,自定义消息内容(JSON、文本、ArrayBuffer)并发送,查看响应。
支持多语言字符分割,准确统计汉字、英文单词、日文假名数量,并评估社交媒体发文长度。
添加多个色块拖拽顺序,直观表现层叠上下文与z-index值。