18

我试图阻止用户返回我的网络应用程序。为此,我尝试捕获window.onpopstate并添加e.preventDefault以取消后退按钮效果。

但这似乎没有发生。

window.addEventListener('popstate',function(e){ 
console.log(e); e.preventDefault();  
});

难道不能阻止popstate浏览器的事件吗?还是我做错了什么?

4

2 回答 2

32

根据此文档,popstate 事件不可取消:

规范:HTML5
接口:PopStateEvent
气泡:是
可取消:否
目标:defaultView
默认操作:无

于 2015-09-07T06:29:27.830 回答
7

首先,“不可能”永远不是一个可以接受的答案。

其次,您可以补偿 popstate 错误。例如,我的富编辑器必须不断补偿懒惰的混蛋键:退格键。它不是后退按钮的有效键(就像“页面向下”的空格键一样),但人们将他们的个人偏好强加于世界而不是添加浏览器扩展,因此当人们按下它时,有时会触发弹出状态而不是编辑器删除任何内容字符位于键盘插入符号的左侧。

以下代码(我的平台文档中的依赖项)检测何时触发 popstate 错误,用 a 拍打它,e.preventDefault();然后用 . 修复地址栏地址history.go(1);。使用编辑器的人没有注意到任何事情发生,因为不允许浏览器操作 DOM。这段代码很少(其他人可能会在各种情况下补偿这个错误),我目前只在 Gecko/Firefox 中测试过,所以一定要测试基于 Blink、Presto、Trident 和 WebKit 的浏览器。

window.onpopstate = function(e)
{
 if (id_('editor') && is_node_parent(document.activeElement,id_('editor')))
 {
  e.preventDefault();
  history.go(1);
 }
}
于 2017-07-22T02:17:18.900 回答