Rails 在 Turbolinks 下,window.onbeforeunload 如何来触发呢?

iamroody · 2013年07月03日 · 最后由 Rei 回复于 2013年07月04日 · 4153 次阅读

相信有很多的人使用 window.onbeforeunload 在用户切换或者关闭页面时,给用户提示说“有未保存的修改,是否确定要离开该页面”。但是在 Turbolinks 开启的状态下,页面的切换时无法触发该事件,除非添加“data-no-turbolink”,在这种情况下,应该如何处理呢?

你 listen to turbolink 的 page:fetch 应该就 ok 把

.on 'page:fetch', ->
   # alert user
   return false if not leaving

#1 楼 @larryzhao restore 的时候没有前置的 event

#2 楼 @Rei then I don't know.

我基本没用过 turbolink, 根据之前看 document 的印象觉得可能这样可以吧。一起求解。

整理了一下,监控 3 个事件:

  1. beforeunload 关闭浏览器
  2. page:fetch 访问新页面
  3. popstate 浏览器后退

#4 楼 @Rei "page:fetch" 确实可以监控到页面的切换,但是弹出 alert 之后,如何停止页面的切换呢?return fasle 和 e.preventDefault() 都无法阻止页面的继续切换。

#5 楼 @iamroody 从源码来看应该 preventDefault 就有效

我做了个测试

$(document).on('click', 'a', function(e) { if (! confirm()) e.preventDefault(); })

点取消是可以阻止切换的。

#6 楼 @Rei 我是这样写的: $(document).on 'page:fetch', (e) -> alert("you are trying to change page!") e.preventDefault() e.stopPropagation()

#7 楼 @iamroody 奥,搞错,page:fetch 虽然触发事件,但是后续动作不会根据结果中断的。

目前我觉得最简单的是监控 click 了。

#8 楼 @Rei 监听 a 的 click 事件,覆盖面有点太广了。准备给 turbolinks 提 isssue,希望未来能有 pre-fetch 这样的功能。

#8 楼 @Rei 要弄懂 turbolinks,是不是要有很好的 js 基础?

#10 楼 @imlcl 不到 300 行 coffeescript,不算难。

#11 楼 @Rei 你那篇博文我有看。请问你现在用 turbolinks 吗?

#12 楼 @imlcl 是的,writings.io 全站都用 Turbolinks。

#13 楼 @Rei writings.io 肯定需要检测用户是否有未保存的修改,当用户切换页面的时候。你是检测的 click a 事件?

#14 楼 @iamroody writings.io 每次输入都完整提交,所以不检测未保存。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号