Chrome与Edge启动时ondevicechange事件注册即触发问题咨询
关于Chrome/Edge中ondevicechange事件首次触发的问题解答
行为性质判断
这是Chrome/Edge的设计行为,并非Bug。这类触发是浏览器在初始化媒体设备列表完成后,向页面同步当前设备状态的机制——首次注册事件时,浏览器会主动触发一次,让页面能获取到初始的设备状态,避免页面注册事件后错过设备列表的初始化信息。而Firefox/Opera采用了不同的初始化策略,所以没有这个现象。
忽略首次触发的方案
因为事件对象本身没有区分属性,纯浏览器检测的方案也不够理想,可以通过标记首次触发状态来实现:
- 初始化一个状态变量,标记是否为首次触发
- 事件回调中先判断状态,首次触发时更新标记并不执行业务逻辑,后续触发再正常处理
示例代码:
let isFirstTrigger = true; navigator.mediaDevices.ondevicechange = (event) => { if (isFirstTrigger) { isFirstTrigger = false; return; // 跳过首次触发 } // 此处编写你的业务逻辑 alert('ON_DEVICE_CHANGE'); };
这个方案不依赖浏览器检测,通用性更强,同时能准确过滤掉首次启动浏览器后的那次触发。
内容的提问来源于stack exchange,提问作者VladL
相关产品推荐
相关产品推荐

