Windows更新后Dispatch Event在IE、Firefox失效,脚本仅Chrome可用求排查
问题分析与解决方案
嘿,我来帮你捋捋这个问题~Windows更新确实有可能间接搞出这种状况(比如更新后调整了浏览器的安全策略、IE的ActiveX控件限制啥的),但从你贴的代码来看,浏览器事件API的兼容性问题才是最可能的元凶,毕竟IE和Firefox对传统事件创建方式的支持跟Chrome差得挺多的。
你的代码里的兼容性坑
你现在用document.createEvent("Event")加initEvent来触发change事件,但这里有两个大问题:
- IE浏览器:IE根本不认
Event这个事件类型,得用HTMLEvents才行,而且它还有自己专属的fireEvent方法来触发事件,initEvent在IE里的参数行为也不一样; - Firefox:虽然它支持
createEvent,但触发下拉框的change事件时,有时候得确保元素的选中状态完全同步好了再触发,不然可能没反应。
兼容IE、Firefox和Chrome的修改方案
把事件触发的部分改成下面这样,就能覆盖主流浏览器了:
function SetSel(value) { switcher_combo.value = value; switcher_combo.selected = true; // 兼容多浏览器的change事件触发逻辑 if ("createEvent" in document) { // 针对Firefox、Chrome这类标准浏览器 var event = document.createEvent("HTMLEvents"); event.initEvent("change", true, true); switcher_combo.dispatchEvent(event); } else { // 专门适配IE浏览器 switcher_combo.fireEvent("onchange"); } return false; }
如果你们已经不用考虑特别老的IE版本了,也可以用更现代的写法:
function SetSel(value) { switcher_combo.value = value; switcher_combo.selected = true; // 直接用Event构造函数,部分旧版Firefox可能需要个小polyfill,但大部分情况没问题 switcher_combo.dispatchEvent(new Event('change', { bubbles: true, cancelable: true })); return false; }
关于Windows更新的排查方向
要是改完代码还是不行,那可以查查Windows更新的锅:
- 看看是不是更新给浏览器装了补丁,导致浏览器的JS执行逻辑变了;
- 检查IE的安全设置是不是被更新改了,比如禁用了某些JavaScript特性;
- 确认Firefox是不是跟着Windows更新同步更了版本,导致事件处理逻辑变了,可以试试回退Firefox版本测测。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

