90

如何在用户离开页面之前要求用户确认,就像在 gmail 中一样?

我在各个地方搜索了这个问题,但他们提到的只是使用 javascript window.unload & window.onbeforeunload。此外,它在大多数情况下都无法在 chrome 中工作,因为它被阻止了。

4

9 回答 9

137

试试这个:

<script>
window.onbeforeunload = function (e) {
    e = e || window.event;

    // For IE and Firefox prior to version 4
    if (e) {
        e.returnValue = 'Sure?';
    }

    // For Safari
    return 'Sure?';
};
</script>

这是一个工作的jsFiddle

于 2012-04-25T07:41:02.140 回答
12

试试这个:

<script>
    window.onbeforeunload = function(e) {
       return 'Dialog text here.';
    };
</script>

更多信息在这里MDN

于 2015-07-19T15:56:07.070 回答
7

我将答案集的评论读为Okay。大多数用户都要求应该允许按钮和一些链接点击。在这里,将在现有代码中添加了另一行代码。

<script type="text/javascript">
  var hook = true;
  window.onbeforeunload = function() {
    if (hook) {

      return "Did you save your stuff?"
    }
  }
  function unhook() {
    hook=false;
  }

调用 unhook() onClick 获取您想要允许的按钮和链接。例如

<a href="#" onClick="unhook()">This link will allow navigation</a>
于 2017-05-18T07:36:38.800 回答
7

2020年最短的解决方案(给那些不需要支持IE的快乐的人)

在 Chrome、Firefox、Safari 中测试。

function onBeforeUnload(e) {
    if (thereAreUnsavedChanges()) {
        e.preventDefault();
        e.returnValue = '';
        return;
    }

    delete e['returnValue'];
}

window.addEventListener('beforeunload', onBeforeUnload);

实际上,没有一种现代浏览器(Chrome、Firefox、Safari)会向用户显示“返回值”作为问题。相反,它们会显示自己的确认文本(取决于浏览器)。但是我们仍然需要返回一些(甚至是空的)字符串来触发 Chrome 上的确认。

更多解释请参见 MDN此处此处

于 2020-04-24T08:16:00.040 回答
4

简单地

function goodbye(e) {
        if(!e) e = window.event;
        //e.cancelBubble is supported by IE - this will kill the bubbling process.
        e.cancelBubble = true;
        e.returnValue = 'You sure you want to leave?'; //This is displayed on the dialog

        //e.stopPropagation works in Firefox.
        if (e.stopPropagation) {
            e.stopPropagation();
            e.preventDefault();
        }
    }
window.onbeforeunload=goodbye;
于 2019-02-19T12:10:26.080 回答
2

如果您想根据情况询问:

var ask = true
window.onbeforeunload = function (e) {
    if(!ask) return null
    e = e || window.event;
    //old browsers
    if (e) {e.returnValue = 'Sure?';}
    //safari, chrome(chrome ignores text)
    return 'Sure?';
};
于 2019-10-06T12:29:03.973 回答
0
  1. 如果没有选择任何内容,假设我想关闭一个窗口
  2. 我想用选定的东西关闭窗口,但不提示我。
  3. 我想关闭一个窗口,但选择了一些东西提示我。

对于这三个条件,我在以下代码中进行了很多搜索,做出了适合我需要的更改,希望对其他人有所帮助。如果我想弹出提示“true”,则询问是一个键,否则会提示您关闭窗口。假设我想打印我的文档并重定向我的页面,询问将是错误的并且不会有提示。假设您的页面有数据然后检查条件是我的情况如果小计为零则值小计然后没有提示其他明智的提示我您的页面中有一些东西。

<pre>
    var ask = true;
    window.onbeforeunload = function(e) {
       if (!ask) return null
       var subtotal = $('#lblgtwithsgst').text();
         if (subtotal != '0') {
          e = e || window.event;
          //old browsers
            if (e) {
             e.returnValue = 'Sure?';
            }
            //safari, chrome(chrome ignores text)
            return 'Sure?';
         }  
      }
      $('#btnPrint').click(function(){
        ask = false;
        ///print your doc no prompt if ask is false;
      )};
于 2021-05-09T21:39:46.693 回答
0
// use jquery version older than 1.6
var preventUnloadPrompt;
var messageBeforeUnload =
  'my message here - Are you sure you want to leave this page?';
$('a').live('click', function () {
  preventUnloadPrompt = true;
});
$('form').live('submit', function () {
  preventUnloadPrompt = true;
});

$(window).bind('beforeunload', function (e) {
  var rval;
  if (preventUnloadPrompt) {
    return;
  } else {
    return messageBeforeUnload;
  }

  return rval;
});
于 2021-12-09T11:28:50.507 回答
0

对于 Angular,更改组件表单名称并粘贴到需要显示警报的组件中。

  @HostListener('window:beforeunload', ['$event'])
  beforeunloadHandler(event) {
    return !this.form.dirty;
  }
于 2022-01-10T04:56:10.873 回答