离开页面前的 JavaScript

IT技术 javascript jquery
2021-01-12 02:26:11

我想在用户离开页面之前进行确认。如果他说好,那么它会重定向到新页面或取消离开。我试着用 onunload

<script type="text/javascript">
function con() {
    var answer = confirm("do you want to check our other products")
    if (answer){

        alert("bye");
    }
    else{
        window.location = "http://www.example.com";
    }
}
</script>
</head>

<body onunload="con();">
<h1 style="text-align:center">main page</h1>
</body>
</html>

但是它在页面已经关闭后确认?如何正确操作?

如果有人展示如何使用 jQuery 做到这一点会更好吗?

6个回答

onunload(或onbeforeunload) 不能将用户重定向到另一个页面。这是出于安全原因。

如果要在用户离开页面之前显示提示,请使用onbeforeunload

window.onbeforeunload = function(){
  return 'Are you sure you want to leave?';
};

或者使用 jQuery:

$(window).bind('beforeunload', function(){
  return 'Are you sure you want to leave?';
});

这只会询问用户是否要离开页面,如果他们选择留在页面上,则无法重定向他们。如果他们选择离开,浏览器将转到他们告诉它去的地方。

您可以onunload在页面卸载之前执行一些操作,但不能从那里重定向(Chrome 14+ 阻止内部警报onunload):

window.onunload = function() {
    alert('Bye.');
}

或者使用 jQuery:

$(window).unload(function(){
  alert('Bye.');
});
@programmer5000 这很好,因为一些恶意网站可以显示一些无用的警告(例如“你不能不提供你的银行信息就离开”)
2021-03-19 02:26:11
请注意,如果您想有条件地在 中显示消息onbeforeunloadreturn false将使浏览器在对话框中显示“false”。return undefined如果您想让窗口在没有用户警报的情况下关闭,则需要这样做。
2021-03-21 02:26:11
@Adam:Firefox 决定禁止自定义该消息。这是浏览器的一部分,因此您无法覆盖该行为。其他浏览器也可能会删除自定义消息的功能。请参阅:developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/...
2021-03-21 02:26:11
@Joseph:当您从 返回一个字符串时onbeforeunload,浏览器会将该字符串放入其自己的确认框中。confirmonunloadand 中使用是没有用的onbeforeunload,因为只有浏览器可以控制它的去向,而不是你。看看这个演示:jsfiddle.net/3kvAC
2021-03-27 02:26:11
@RocketHazmat Chrome 也有。它现在只说:你想离开这个网站吗?您所做的更改可能无法保存。
2021-04-05 02:26:11

当您还检测表单状态更改与否时,此代码。

$('#form').data('serialize',$('#form').serialize()); // On load save form current state

$(window).bind('beforeunload', function(e){
    if($('#form').serialize()!=$('#form').data('serialize'))return true;
    else e=null; // i.e; if form state change show warning box, else don't show it.
});

您可以使用 Google JQuery Form Serialize 函数,这将收集所有表单输入并将其保存在数组中。我想这个解释就足够了:)

这可以被任何其他插件等覆盖,主要是开发人员在选择器上犯了错误,如果您怀疑是否被覆盖,请将您的 jquery 代码放在 </body> 标签之前。
2021-03-22 02:26:11
顺便说一句……这里有更好的方法:stackoverflow.com/q/16322042/114029
2021-03-25 02:26:11
知道为什么这行不通吗?它会被其他 js 函数/jquery 插件覆盖吗?我正在运行一个 webrtc 应用程序,我想在客户端关闭窗口时“关闭”一些东西,因此需要处理窗口关闭。
2021-03-31 02:26:11
是的...如果您有一些 JS 代码在页面加载后隐藏或禁用输入字段,那么当您进行检查以比较隐藏\禁用字段时将不会被序列化。检查当然会失败。;) 有这个解决方法:stackoverflow.com/a/4748748/114029
2021-04-01 02:26:11
应该注意的是,当按下提交按钮时,这也会引发警告。可以通过单击提交按钮再次序列化表单以防止这种情况发生。
2021-04-02 02:26:11

这将在离开当前页面时发出警报

<script type='text/javascript'>
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; 

</script>

这是我在有未保存数据时显示确认消息的操作

window.onbeforeunload = function() {
  if (isDirty) {
    return 'There is unsaved data.';
  }
  return undefined;
}

返回undefined将禁用确认

注意:返回null将不适用于 IE

您也可以使用undefined禁用确认

window.onbeforeunload = undefined;

为了在 Chrome 14+ 上使用 popop,您需要执行以下操作:

jQuery(window).bind('beforeunload', function(){
    return 'my text';
});

将询问用户是要留下还是离开。

@hey 为什么投反对票?它正在工作......您需要确保它在 之外,jQuery(document)我建议在加载所有插件后将其正确放置。此外,此代码段不会发出任何警报......它只是一个带有return.
2021-03-15 02:26:11
知道为什么这不起作用吗?我正在使用 chrome(最新版本)和一堆 jquery 插件,但是当我关闭窗口时我没有收到任何警报。
2021-04-06 02:26:11