如何显示“您确定要离开此页面吗?” 何时提交更改?

IT技术 javascript html message onbeforeunload confirm
2021-01-16 16:37:45

在 stackoverflow 中,如果您开始进行更改然后尝试离开该页面,则会出现一个 javascript 确认按钮并询问:“您确定要离开该页面吗?” 呜呜呜呜呜...

有没有人以前实现过这个,我如何跟踪已提交的更改?我相信我自己可以做到这一点,我正在努力向专家们学习良好的做法。

我尝试了以下但仍然不起作用:

<html>
<body>
    <p>Close the page to trigger the onunload event.</p>
    <script type="text/javascript">
        var changes = false;        
        window.onbeforeunload = function() {
            if (changes)
            {
                var message = "Are you sure you want to navigate away from this page?\n\nYou have started writing or editing a post.\n\nPress OK to continue or Cancel to stay on the current page.";
                if (confirm(message)) return true;
                else return false;
            }
        }
    </script>

    <input type='text' onchange='changes=true;'> </input>
</body>
</html>

任何人都可以发布一个例子吗?

6个回答

更新 (2017)

现代浏览器现在认为显示自定义消息是一种安全隐患,因此已从所有浏览器中删除浏览器现在只显示一般消息。既然我们再也不用担心设置消息了,就这么简单:

// Enable navigation prompt
window.onbeforeunload = function() {
    return true;
};
// Remove navigation prompt
window.onbeforeunload = null;

阅读下面的旧浏览器支持。

更新 (2013)

原始答案适用于 IE6-8 和 FX1-3.5(这是我们在 2009 年编写时的目标),但现在已经过时并且在大多数当前浏览器中都不起作用 - 我已经离开了下面供参考。

window.onbeforeunload所有浏览器都没有一致的处理。它应该是一个函数引用而不是一个字符串(如原始答案所述),但这将适用于较旧的浏览器,因为对大多数浏览器的检查似乎是是否分配了任何内容onbeforeunload(包括返回的函数null)。

您设置window.onbeforeunload为函数引用,但在较旧的浏览器中,您必须设置returnValue事件的 ,而不仅仅是返回字符串:

var confirmOnPageExit = function (e) 
{
    // If we haven't been passed the event get the window.event
    e = e || window.event;

    var message = 'Any text will block the navigation and display a prompt';

    // For IE6-8 and Firefox prior to version 4
    if (e) 
    {
        e.returnValue = message;
    }

    // For Chrome, Safari, IE8+ and Opera 12+
    return message;
};

confirmOnPageExit如果您希望用户在没有消息的情况下继续,则不能进行检查并返回 null。您仍然需要删除事件以可靠地打开和关闭它:

// Turn it on - assign the function that returns the string
window.onbeforeunload = confirmOnPageExit;

// Turn it off - remove the function entirely
window.onbeforeunload = null;

原始答案(2009 年工作)

打开它:

window.onbeforeunload = "Are you sure you want to leave?";

要关闭它:

window.onbeforeunload = null;

请记住,这不是正常事件 - 您无法以标准方式绑定到它。

检查值?这取决于您的验证框架。

在 jQuery 中,这可能类似于(非常基本的示例):

$('input').change(function() {
    if( $(this).val() != "" )
        window.onbeforeunload = "Are you sure you want to leave?";
});
值得注意的是,'returnValue' 方法是标准中唯一指定的方法,因此它不仅适用于 IE6-8,还适用于所有符合标准的浏览器(在这种情况下不包括 Chrome、Safari 和 Opera)。
2021-03-10 16:37:45
为了停止提交表单时的警报,我使用了$("#submit_button").click(function() { window.onbeforeunload = null; });. 我最初使用了按钮的 onclick 事件,但它也不是很好,它也不适用于 IE8。
2021-03-19 16:37:45
对于简单的检查,或者您可以对每个更改添加更复杂的验证
2021-03-28 16:37:45
@AlikElzin-kilaka 你不能。如果要更改弹出文本,则需要创建自己的自定义弹出窗口,但这无法阻止该window.onbeforeunload事件。
2021-03-30 16:37:45
这将类似于: $('input:text').change(function() { window.onbeforeunload = $('input:text[value!=""]').length > 0 ? "warning" :null ; });
2021-04-06 16:37:45

onbeforeunload微软主义是我们要一个标准的解决方案,但要知道,浏览器支持参差不齐最接近; 例如,对于 Opera,它仅适用于版本 12 及更高版本(在撰写本文时仍处于测试阶段)。

此外,为了获得最大的兼容性,您需要做的不仅仅是简单地返回一个字符串,如Mozilla 开发人员网络中所述

示例:定义以下两个函数来启用/禁用导航提示(参见 MDN 示例):

function enableBeforeUnload() {
    window.onbeforeunload = function (e) {
        return "Discard changes?";
    };
}
function disableBeforeUnload() {
    window.onbeforeunload = null;
}

然后定义一个这样的表单:

<form method="POST" action="" onsubmit="disableBeforeUnload();">
    <textarea name="text"
              onchange="enableBeforeUnload();"
              onkeyup="enableBeforeUnload();">
    </textarea>
    <button type="submit">Save</button>
</form>

这样,用户只有在更改了文本区域时才会收到有关导航离开的警告,而在他实际提交表单时不会收到提示。

基于 Mozill 的站点,最新的桌面浏览器现在支持它:developer.mozilla.org/en/DOM/window.onbeforeunload
2021-03-21 16:37:45
微软主义是一个伟大的术语。
2021-04-07 16:37:45

要在 Chrome 和 Safari 中完成这项工作,您必须这样做

window.onbeforeunload = function(e) {
    return "Sure you want to leave?";
};

参考:https : //developer.mozilla.org/en/DOM/window.onbeforeunload

使用 JQuery,这件事很容易做到。因为你可以绑定到集合。

仅执行 onbeforeunload 是不够的,您只想在有人开始编辑内容时触发导航。

Jon St John原始链接已损坏,因此我将其更新为Wayback Machine版本。链接的内容可以在许多其他站点中找到,但我想最好“保留”山姆添加的那个
2021-03-14 16:37:45
似乎无法点击 @jonstjohn 的博客文章。也许他会成为朋友并为我们指明正确的方向?:D
2021-03-19 16:37:45
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会无效。
2021-03-28 16:37:45
=> 500 内部错误。这就是为什么在 SO 上不推荐使用链接的原因。否决直到修复。
2021-04-03 16:37:45
此网页无法使用
2021-04-05 16:37:45

jquerys 'beforeunload' 对我很有用

$(window).bind('beforeunload', function(){
    if( $('input').val() !== '' ){
        return "It looks like you have input you haven't submitted."
    }
});
绑定已被弃用,在此答案中可以看到与此类似的较新版本的代码:stackoverflow.com/a/1889450/908677
2021-03-29 16:37:45