在stackoverflow中,如果您开始进行更改,那么您尝试离开页面,会出现一个javascript确认按钮并询问:“您确定要离开此页面吗?” blee blah bloo ...
之前是否有人实现了这一点,如何跟踪提交的更改? 我相信自己可以做到这一点,我正在努力学习专家们的良好做法。
我尝试了以下但仍然无效:
<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>
有人发帖吗?
答案 0 :(得分:334)
现代浏览器现在考虑将自定义消息显示为安全隐患,因此所有这些消息都是removed。浏览器现在只显示通用消息。由于我们不再需要担心设置消息,因此它非常简单:
// Enable navigation prompt
window.onbeforeunload = function() {
return true;
};
// Remove navigation prompt
window.onbeforeunload = null;
请阅读下面的旧版浏览器支持。
原始答案适用于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;
要打开它:
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?";
});
答案 1 :(得分:37)
onbeforeunload
Microsoft-ism是我们对标准解决方案最接近的事情,但要注意浏览器支持不均匀;例如对于Opera,它仅适用于12及更高版本(截至本文撰写时仍为测试版)。
此外,对于最大兼容性,您需要做的不仅仅是返回字符串,如Mozilla Developer Network所述。
示例:定义以下两个用于启用/禁用导航提示的功能(参见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>
这样,只有在用户更改了文本区域时才会向用户发出警告,并且在他实际提交表单时不会提示用户。
答案 2 :(得分:19)
要在Chrome和Safari中使用,您必须这样做
window.onbeforeunload = function(e) {
return "Sure you want to leave?";
};
参考:https://developer.mozilla.org/en/DOM/window.onbeforeunload
答案 3 :(得分:18)
With JQuery这个东西很容易做到。因为你可以绑定到集合。
它还不足以进行onbeforeunload,你只想在有人开始编辑内容时触发导航。
答案 4 :(得分:13)
jquerys'afterunload'对我很有用
$(window).bind('beforeunload', function(){
if( $('input').val() !== '' ){
return "It looks like you have input you haven't submitted."
}
});
答案 5 :(得分:11)
对于正在寻找简单解决方案的新人,只需尝试Areyousure.js
答案 6 :(得分:11)
如果有任何数据输入到表单中,这是一种简单的方式来显示消息,而不是在提交表单时显示消息:
$(function () {
$("input, textarea, select").on("input change", function() {
window.onbeforeunload = window.onbeforeunload || function (e) {
return "You have unsaved changes. Do you want to leave this page and lose your changes?";
};
});
$("form").on("submit", function() {
window.onbeforeunload = null;
});
})
答案 7 :(得分:7)
展开Keith's already amazing answer:
要允许自定义警告消息,您可以将其包装在如下函数中:
function preventNavigation(message) {
var confirmOnPageExit = function (e) {
// If we haven't been passed the event get the window.event
e = e || window.event;
// For IE6-8 and Firefox prior to version 4
if (e)
{
e.returnValue = message;
}
// For Chrome, Safari, IE8+ and Opera 12+
return message;
};
window.onbeforeunload = confirmOnPageExit;
}
然后只需使用您的自定义消息调用该函数:
preventNavigation("Baby, please don't go!!!");
要重新启用导航,您只需将window.onbeforeunload
设置为null
即可。在这里,它包含在一个可以在任何地方调用的简洁小功能:
function enableNavigation() {
window.onbeforeunload = null;
}
如果使用jQuery,可以很容易地绑定到这样的表单的所有元素:
$("#yourForm :input").change(function() {
preventNavigation("You have not saved the form. Any \
changes will be lost if you leave this page.");
});
然后允许提交表单:
$("#yourForm").on("submit", function(event) {
enableNavigation();
});
preventNavigation()
和enableNavigation()
可以根据需要绑定到任何其他函数,例如动态修改表单或单击发送AJAX请求的按钮。我通过在表单中添加一个隐藏的输入元素来完成此操作:
<input id="dummy_input" type="hidden" />
然后,只要我想阻止用户导航,我就会触发对该输入的更改以确保执行preventNavigation()
:
function somethingThatModifiesAFormDynamically() {
// Do something that modifies a form
// ...
$("#dummy_input").trigger("change");
// ...
}
答案 8 :(得分:3)
这里试试这个100%
<html>
<body>
<script>
var warning = true;
window.onbeforeunload = function() {
if (warning) {
return "You have made changes on this page that you have not yet confirmed. If you navigate away from this page you will lose your unsaved changes";
}
}
$('form').submit(function() {
window.onbeforeunload = null;
});
</script>
</body>
</html>
答案 9 :(得分:2)
当用户开始对表单进行更改时,将设置布尔标志。如果用户然后尝试离开页面,则在window.onunload事件中检查该标志。如果设置了该标志,则通过将其作为字符串返回来显示该消息。将消息作为字符串返回将弹出包含您的消息的确认对话框。
如果您使用ajax提交更改,则可以在提交更改后将标志设置为false
(即在ajax成功事件中)。
答案 10 :(得分:2)
可以通过取消standard states事件或将返回值设置为beforeunload来控制提示non-null value。它还指出,作者应使用Event.preventDefault()而不是returnValue,并将消息显示给用户is not customizable。
从69.0.3497.92开始,Chrome尚未达到标准。但是,提交了bug report,并且正在进行review。 Chrome要求通过引用事件对象而不是处理程序返回的值来设置returnValue。
跟踪是否已进行更改是作者的责任;可以使用变量来完成,也可以确保仅在必要时处理事件。
window.addEventListener('beforeunload', function (e) {
// Cancel the event as stated by the standard.
e.preventDefault();
// Chrome requires returnValue to be set.
e.returnValue = '';
});
window.location = 'about:blank';
答案 11 :(得分:1)
基于此主题的所有答案,我编写了以下代码,它对我有用。
如果您只有一些需要检查onunload事件的输入/ textarea标记,则可以将HTML5数据属性指定为data-onunload="true"
例如。
<input type="text" data-onunload="true" />
<textarea data-onunload="true"></textarea>
和Javascript(jQuery)看起来像这样:
$(document).ready(function(){
window.onbeforeunload = function(e) {
var returnFlag = false;
$('textarea, input').each(function(){
if($(this).attr('data-onunload') == 'true' && $(this).val() != '')
returnFlag = true;
});
if(returnFlag)
return "Sure you want to leave?";
};
});
答案 12 :(得分:1)
您可以在设置JS中的变量的textarea(或任何其他字段)上添加onchange
事件。当用户尝试关闭页面(window.onunload)时,您检查该变量的值并相应地显示警报。
答案 13 :(得分:1)
这是我的HTML
<!DOCTYPE HMTL>
<meta charset="UTF-8">
<html>
<head>
<title>Home</title>
<script type="text/javascript" src="script.js"></script>
</head>
<body onload="myFunction()">
<h1 id="belong">
Welcome To My Home
</h1>
<p>
<a id="replaceME" onclick="myFunction2(event)" href="https://www.ccis.edu">I am a student at Columbia College of Missouri.</a>
</p>
</body>
所以这就是我在javaScript中做类似的事情
var myGlobalNameHolder ="";
function myFunction(){
var myString = prompt("Enter a name", "Name Goes Here");
myGlobalNameHolder = myString;
if (myString != null) {
document.getElementById("replaceME").innerHTML =
"Hello " + myString + ". Welcome to my site";
document.getElementById("belong").innerHTML =
"A place you belong";
}
}
// create a function to pass our event too
function myFunction2(event) {
// variable to make our event short and sweet
var x=window.onbeforeunload;
// logic to make the confirm and alert boxes
if (confirm("Are you sure you want to leave my page?") == true) {
x = alert("Thank you " + myGlobalNameHolder + " for visiting!");
}
}
答案 14 :(得分:0)
可以通过在 TextArea 的 onChange 事件上将 ChangeFlag 设置为true来轻松完成。使用javascript根据 ChangeFlag 值显示确认对话框。如果确认返回true,则放弃表单并导航到请求的页面,否则不执行任何操作。
答案 15 :(得分:0)
您要使用的是JavaScript中的onunload事件。
答案 16 :(得分:0)
从 WebAPIs->WindowEventHandler->onbeforeunload 开始,它建议使用 window.addEventListener()
和 beforeunload
事件,而不是 onbeforeunload
。
window.addEventListener("beforeunload", function(event) { ... });
window.onbeforeunload = function(event) { ... };
注意:HTML 规范规定作者应该使用 Event.preventDefault()
方法而不是使用 Event.returnValue
来提示用户。
因此,就您的情况而言,代码应如下所示:
//javascript
window..addEventListener("beforeunload", function(event) {
//your code
// If you prevent default behaviour in Mozilla Firefox prompt will always be shown
e.preventDefault();
// Chrome requires returnValue to be set
e.returnValue = '';
})
答案 17 :(得分:-1)
你可以从那里调用javascript函数的body标签有一个“onunload”参数。如果它返回false,则会阻止导航。