Как показать "вы уверены, что хотите уйти с этой страницы?- когда произошли изменения?
здесь, в 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?nnYou have started writing or editing a post.nnPress 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>
может ли кто-нибудь опубликовать пример?
17 ответов
обновление (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 году)
, чтобы включить его on:
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?";
});
на onbeforeunload
Microsoft-ism-это самое близкое к стандартному решению, но имейте в виду, что поддержка браузера неравномерна; например, для 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>
таким образом, пользователь будет предупрежден только о навигации, если он изменил текстовую область, и не будет предложено, когда он фактически отправляет форму.
чтобы сделать эту работу в Chrome и Safari, вам придется сделать это так
window.onbeforeunload = function(e) {
return "Sure you want to leave?";
};
ссылка:https://developer.mozilla.org/en/DOM/window.onbeforeunload
С JQuery это довольно легко сделать. Поскольку вы можете привязываться к наборам.
его недостаточно, чтобы сделать onbeforeunload, вы хотите только вызвать навигацию, если кто-то начал редактировать материал.
jquerys 'beforeunload' отлично работал для меня
$(window).bind('beforeunload', function(){
if( $('input').val() !== '' ){
return "It looks like you have input you haven't submitted."
}
});
Это простой способ представить сообщение, если какие-либо данные вводятся в форму, и не показывать сообщение, если форма отправлена:
$(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;
});
})
для новых людей, которые ищут простое решение, просто попробовать Areyousure.js
расширить на Кит уже удивительный ответ!--14-->:
настраиваемые предупреждающие сообщения
чтобы разрешить пользовательские предупреждения, вы можете обернуть его в функцию, как это:
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
to null
. Вот он, завернутый в аккуратную маленькую функцию, которая может зовите куда угодно:
function enableNavigation() {
window.onbeforeunload = null;
}
использование jQuery для привязки этого к элементам формы
при использовании 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");
// ...
}
здесь попробуйте это работает 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>
когда пользователь начнет вносить изменения в форму, будет установлен логический флаг. Если пользователь затем пытается перейти от страницы, вы установите этот флаг в
вы можете добавить onchange
событие в textarea (или любых других полях), которые устанавливают переменную в JS. Когда пользователь пытается закрыть страницу (окно.onunload) вы проверяете значение этой переменной и показываете предупреждение соответствующим образом.
основываясь на всех ответах в этой теме, я написал следующий код, и он сработал для меня.
Если у вас есть только некоторые теги ввода/textarea, которые требуют проверки события onunload, вы можете назначить атрибуты данных 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?";
};
});
вот мой 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!");
}
}
на стандартные государств что подсказка может управляться путем отмены beforeunload событие или установка возвращаемого значения в не-null значение. В нем также говорится, что авторы должны использовать Event.preventDefault () вместо returnValue и сообщение, показанное пользователю не настраиваемая.
по состоянию на 69.0.3497.92 Chrome не соответствует стандарту. Тем не менее, есть сообщить об ошибке подано, и a комментарий в ходе. 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';
Это можно легко сделать, установив ChangeFlag истина, о onChange, после событие TextArea. Используйте javascript, чтобы показать подтвердить диалоговое окно на основе ChangeFlag значение. Отбросьте форму и перейдите на запрашиваемую страницу, если подтвердить возвращает true, else вообще ничего.
то, что вы хотите использовать, это событие onunload в JavaScript.
вот пример:http://www.w3schools.com/jsref/event_onunload.asp
существует параметр "onunload"для тега body, из которого вы можете вызывать функции javascript. Если он возвращает false, он предотвращает навигацию.