振动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 的轻量替代。
在页面中手动触发 JS 错误、网络延迟、API 失败等,观察前端异常处理机制是否健全。
通过加载测试广告脚本或元素来检测浏览器是否启用广告拦截插件,并展示检测原理。
输入可能的攻击向量,选择不同的转义或过滤策略,实时查看是否被安全处理,教育安全开发。
代理 WebSocket 连接,实时拦截并展示所有文本/二进制消息,支持过滤和搜索。
演示如何动态更新 datalist 选项以实现搜索建议,并处理键盘选择。
尝试将目标 URL 加载到 iframe 中,检测是否缺少点击劫持防护头,并展示风险。
分析表单 HTML,检查是否每个 input 都有正确关联的 label,并指出使用 aria-label 的替代情况。
设置容器宽度阈值,改变容器大小观察组件内部样式的变化,学习容器查询用法。
配置WebSocket地址,模拟多个并发连接,发送自定义消息并记录响应延迟。
输入对照组和实验组的用户数与转化数,计算 Z 值、P 值,判断是否具有统计显著性。
直观拖拽曲线控制点,生成CSS transition/animation的cubic-bezier()值,并即时播放动画效果预览。
输入源页和引用页URL,构造Webmention请求通知被引用页面,演示独立博客协议。
粘贴代码片段,基于关键字和语法模式自动推断编程语言,适合未命名文件的快速识别。
调节采样频率,观察对正弦波的离散采样和重建效果,演示欠采样导致的频率混叠。
检查XML的格式正确性,报告错误的标签闭合和属性缺失。
输入WebSocket服务地址,建立连接,发送和接收消息,方便调试实时通信应用。
粘贴代码,计算总行数、有效代码行数、注释行数和空行数。
调节两列波的频率、波长和位置,实时观看水面波干涉形成的明暗条纹图案。
在Canvas上绘制理想频率响应,并应用简单FIR滤波器对合成信号进行滤波,听音效对比。
输入两组样本的访问量和转化数,计算P值并判断统计学显著性。
在浏览器中运行完整的SQLite数据库,创建表、插入查询数据,体验客户端强大的SQL能力。
模拟动态区域更新,测试不同aria-live值(polite/assertive)对屏幕阅读器的影响。
输入原始URL,填入来源、媒介、活动名等,生成带UTM规范的推广追踪链接。
设置渐变两端颜色,鼠标滑过渐变条显示任意位置的精确十六进制色。