【发布时间】:2018-01-03 15:28:05
【问题描述】:
您好,我正在尝试实现“您确定要离开此页面吗?”导航离开带有尚未提交的已修改表单的页面时弹出。该网站是使用自定义框架构建的单页应用程序。
由于所有锚链接都由框架处理,因此可以判断单击侧导航链接将导致页面更改并显示 Bootstrap 确认对话框。如果用户单击“确定”,则单击通过并进行 AJAX 调用以提取新页面内容。如果他们单击“取消”,则模式将被关闭并停留在当前页面上。
我无法解决的部分是用户在其网络浏览器中单击“返回”按钮时。这会触发“popstate”事件。由于它是一个单页应用程序,因此所有导航/历史记录都使用历史记录 API 进行管理。
问题是当有人点击“返回”时,由于“popstate”发生,URL 发生了变化,然后我显示“你确定要离开吗?”模态的。当事件发生时,您地址栏中的 URL 现在会显示您将从历史记录中转到的页面,而不是您当前正在查看的页面。如果您在引导程序中单击“取消”,请确认您现在在地址栏中显示错误的 URL。
event.preventDefault、event.stopPropagation 或在 popstate 中返回 false 不会阻止 URL 更改。 AFAIK 你不能在“popstate”之前拦截“Back”按钮。尝试在“popstate”中使用 window.history.replaceState 似乎也不起作用。
有没有人可以解决这个问题?
- 能否在“popstate”事件中阻止 URL 更改?
- 如果您确实决定希望它在模态被接受后通过,您能否以某种方式在“popstate”中重写历史以将 URL 更改回当前页面上的内容并保留先前的条目?李>
- 我没有想到的其他解决方案?
我最初的想法是阻止“popstate”中的 URL 更改,然后让框架触发链接单击以加载新内容并在他们单击“是”时更改 URL,但我还没有找到这样做的方法.
谢谢!
【问题讨论】:
-
我能想到的就是给每个pushState添加一个自定义的状态变量,这样你就可以检测用户是前进还是后退,然后在用户选择时使用
history.go()做反向取消。设置状态检测可能很棘手。
标签: javascript browser-history popstate