仅调试模式下ASPX页面点击后退按钮重载生效的异常问题
解决IE11中onbeforeunload加debugger后仅调试模式生效的页面重载问题
首先得说,你遇到的这个问题其实是IE11对onbeforeunload事件的特殊处理机制导致的,先理清楚来龙去脉:
你原本的这段代码在IE11里用来监听后退按钮并重载页面:
window.onbeforeunload = function (evt) { if (window.event) { if (window.event.clientX < 40 && window.event.clientY < 0) { // Back button/IE window.location.href = window.location.href; // not using window.location.reload() as I dont want to submit the form } } };
但一旦加了debugger语句,就只有开着调试工具点击后退才会触发重载,正常模式下完全没反应——这是因为IE11在正常运行时,会对onbeforeunload里的跳转操作做严格限制,当你插入debugger打断事件流程后,浏览器的安全机制直接跳过了后续的跳转逻辑;而调试模式下浏览器会放宽这些限制,所以代码能正常跑起来。另外,你用clientX和clientY判断后退按钮的方式本身就很不靠谱,不同浏览器甚至IE的不同版本,这个坐标都可能变,属于非常脆弱的实现。
给你两个靠谱的解决方案:
方案1:用pageshow事件替代(推荐)
IE11支持pageshow事件,这个事件在页面从浏览器缓存中加载时(比如点击后退)也会触发,正好完美匹配你的需求,而且完全不依赖那些不可靠的坐标判断:
window.addEventListener('pageshow', function(event) { // event.persisted表示页面是从缓存中加载的(后退操作会触发这个) if (event.persisted) { // 用replaceState避免历史记录重复,同时实现无表单提交的重载 window.location.replace(window.location.href); } });
这个方法不管加不加debugger,正常模式和调试模式都能生效,而且兼容性更稳定。
方案2:修复原onbeforeunload逻辑(如果必须保留原有思路)
如果你一定要沿用原来的onbeforeunload方式,得做两个调整:
- 删掉
debugger语句,避免打断IE11的事件执行流程; - 不要直接在
onbeforeunload里执行跳转,而是用标记变量,在页面加载时处理:
let needReload = false; window.onbeforeunload = function(evt) { const currentEvent = evt || window.event; // 保留你的坐标判断(还是提醒下,这个真的很容易失效) if (currentEvent && currentEvent.clientX < 40 && currentEvent.clientY < 0) { needReload = true; } }; window.onload = function() { if (needReload) { window.location.replace(window.location.href); needReload = false; } };
不过还是强烈建议用方案1,毕竟坐标判断的方式太依赖浏览器的具体实现,哪天IE11更新个小版本可能就又失效了。
内容的提问来源于stack exchange,提问作者MS_Developer
相关产品推荐
相关产品推荐

