在Rails中,onbeforeunload不能始终如一地为Chrome浏览器工作

时间:2016-07-24 11:40:35

标签: javascript jquery ruby-on-rails google-chrome turbolinks

我正在尝试让onbeforeunload在我的页面上始终如一地工作,该页面上有用户填写的表单。我期待以下内容:

  • 当我点击指向其他网页的链接时,会提示用户
  • 当我刷新页面时,它会提示用户

我目前正在使用谷歌浏览器进行测试,我现在正在使用以下内容 - 尽管我尝试了一些变体。

<script>

  $(document).on('ready page:load', function () {
    $(window).on('beforeunload', function() {
      return "You should keep this page open.";
    });
  });

</script>

我已经能够得到提示有时出现但不一致。我认为这可能会与上面的代码和turbolinks发生冲突。但是未能找到解决方案以获得上述预期结果。

---更新:

这是我最终使用的代码。

<script data-turbolinks-eval="false">

$(document).ready(function() {
  form_modified=0;

  $('#report-form *').change(function(){
     form_modified=1;
  });

  $("#report-form input[name='commit']").click(function() {
      form_modified = 0;
  });
});

$(document).on('page:before-change', function() {

  if ($("#report-form").length > 0) {
    if (form_modified==1) {
      if (confirm("There are unsaved changes, click \"Cancel\" to remain on the page.")) {
        // clicks "OK", nothing here means
      } else {
        // clicks "Cancel"
        event.preventDefault();
      }
    }
  }
});

</script>

此方法不适用于页面刷新或通过窗口“X”退出但是......

1 个答案:

答案 0 :(得分:1)

Turbolinks为这种情况提供了page:before-change事件。

但是我不确定为什么要绑定你的第一个处理程序中的第二个处理程序 。单击Turbolinks链接时,window对象不会发生变化。