AJAX表单POST请求在IE中触发页面刷新问题排查求助
我帮你分析下这个IE特有的问题——毕竟旧IE的事件模型和现代浏览器差异挺大的,你提到的e.preventDefault()和e.returnValue=false没生效,大概率是事件处理的兼容性没做全,或者有其他隐藏的触发逻辑。下面是几个针对性的解决思路:
先确保正确获取事件对象
旧版IE里,事件对象不会通过函数参数传递,而是挂在window.event上。如果你的处理函数没兼容这一点,那后续的阻止默认行为代码根本没作用。修改你的事件处理函数开头:function handleFormSubmit(e) { // 兼容IE获取事件对象 e = e || window.event; // 双重阻止默认行为,覆盖现代浏览器和旧IE if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } // 这里放你的AJAX请求逻辑 }检查事件绑定方式是否兼容旧IE
旧IE不支持addEventListener,只认attachEvent,而且事件名要加on前缀。如果你之前只用了addEventListener,那在IE里事件绑定根本没生效,自然阻止不了表单提交。换成兼容的绑定代码:const registrationForm = document.getElementById('你的表单ID'); if (registrationForm.addEventListener) { registrationForm.addEventListener('submit', handleFormSubmit); } else if (registrationForm.attachEvent) { // 旧IE专属的事件绑定方式 registrationForm.attachEvent('onsubmit', handleFormSubmit); }额外加上
return false兜底
有些情况下,即使做了上面的处理,旧IE还是会触发默认行为。可以在事件处理函数的最后加上return false;,这在旧IE的DOM模型里,能额外起到阻止默认行为和事件冒泡的作用:function handleFormSubmit(e) { e = e || window.event; if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } // 执行AJAX请求... return false; }换个思路:绑定按钮点击事件而非表单提交
如果上面的方法都不管用,你可以绕开表单的默认提交逻辑——给提交按钮明确设置type="button"(旧IE里<button>默认类型是submit,容易误触发),然后在按钮的click事件里处理AJAX:<button type="button" id="submitBtn">提交注册</button>然后绑定按钮的点击事件,这样就完全避开了表单的默认提交行为,从根源上解决页面刷新的问题。
排查是否有其他冲突脚本
最后检查下页面里有没有其他脚本也绑定了表单的submit事件,可能你的阻止逻辑被其他脚本覆盖了,或者在你的代码之后又触发了默认行为。可以暂时禁用其他非必要脚本,测试是否能正常阻止刷新,逐步排查冲突点。
内容的提问来源于stack exchange,提问作者Криси Стоянов

