Jak pokazać "czy na pewno chcesz nawigować z dala od tej strony?"kiedy zmiany popełnione?

Tutaj w stackoverflow, jeśli zacząłeś wprowadzać zmiany, to próbujesz przejść z dala od strony, pojawia się przycisk potwierdzenia javascript i pyta: "czy na pewno chcesz przejść z dala od tej strony?"blee blah bloo...

Czy ktoś wprowadził to wcześniej, jak Mogę śledzić, że zmiany zostały popełnione? Wierzę, że mogę to zrobić sam, staram się uczyć dobrych praktyk od was ekspertów.

Próbowałem następujących, ale nadal nie "praca": {]}

<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>

Czy ktoś może zamieścić przykład?

Author: sshow, 2009-07-13

17 answers

[[12]}Aktualizacja (2017)

Współczesne przeglądarki uważają teraz wyświetlanie niestandardowej wiadomości za zagrożenie bezpieczeństwa i dlatego została ona usunięta ze wszystkich z nich. Przeglądarki wyświetlają teraz tylko ogólne wiadomości. Ponieważ nie musimy już martwić się o ustawienie wiadomości, jest to tak proste, jak:

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

Poniżej znajdziesz obsługę starszych przeglądarek.

Aktualizacja (2013)

Oryginalna odpowiedź jest odpowiednia dla IE6-8 i FX1-3.5 (co właśnie celowaliśmy w 2009, kiedy został napisany), ale jest teraz raczej Nieaktualny i nie będzie działać w większości obecnych przeglądarek-zostawiłem go poniżej w celach informacyjnych.

window.onbeforeunload nie jest traktowany konsekwentnie przez wszystkie przeglądarki. Powinno to być odniesienie do funkcji, a nie Łańcuch znaków (jak podano w oryginalnej odpowiedzi), ale będzie to działać w starszych przeglądarkach, ponieważ dla większości z nich sprawdza się, czy coś jest przypisane do onbeforeunload (w tym funkcja, która zwraca null).

Ustawiasz window.onbeforeunload na funkcję odwołanie, ale w starszych przeglądarkach trzeba ustawić returnValue zdarzenia zamiast zwracać tylko ciąg znaków:

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;
};

Nie możesz pozwolić, aby confirmOnPageExit wykonała czek i zwróciła null, jeśli chcesz, aby użytkownik kontynuował bez wiadomości. Nadal musisz usunąć zdarzenie, aby niezawodnie je włączać i wyłączać:

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

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

Original answer (worked in 2009)

Aby go włączyć:

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

Aby go wyłączyć:

window.onbeforeunload = null;

Pamiętaj, że to nie jest normalne wydarzenie - nie możesz związać go w standardowy sposób.

Aby sprawdzić wartości? To zależy od twojej struktury walidacji.

W jQuery może to być coś w stylu (bardzo podstawowy przykład):

$('input').change(function() {
    if( $(this).val() != "" )
        window.onbeforeunload = "Are you sure you want to leave?";
});
 310
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-28 22:47:18

The onbeforeunload Microsoft-ism jest najbliższą rzeczą, jaką mamy do standardowego rozwiązania, ale należy pamiętać, że obsługa przeglądarki jest nierówna; np. dla Opery działa tylko w wersji 12 i późniejszej (wciąż w wersji beta od tego pisania).

Ponadto, dla maksymalnej kompatybilności , musisz zrobić więcej niż tylko zwrócić ciąg znaków, jak wyjaśniono w Mozilla Developer Network.

Przykład: Zdefiniuj następujące dwie funkcje do włączania/wyłączania zachęty nawigacyjnej (por. na Przykład MDN):

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

Następnie zdefiniuj taką formę:

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

W ten sposób użytkownik zostanie ostrzeżony tylko wtedy, gdy zmieni obszar tekstowy i nie zostanie wyświetlony monit, gdy faktycznie przesyła formularz.

 37
Author: Søren Løvborg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-11 20:04:55

Aby to działało w Chrome i Safari, musisz to zrobić w ten sposób

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

Odniesienie: https://developer.mozilla.org/en/DOM/window.onbeforeunload

 19
Author: sshow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-11 20:06:34

Z JQuery to jest dość łatwe do zrobienia. Ponieważ można wiązać do zestawów.

Its NOT enough to do the onbeforeunload, you want to trigger the navigate away if someone started editing stuff.

 17
Author: Sam Saffron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-15 18:31:26

Jquerys 'beforeunload' pracował dla mnie świetnie

$(window).bind('beforeunload', function(){
    if( $('input').val() !== '' ){
        return "It looks like you have input you haven't submitted."
    }
});
 13
Author: Devon Peticolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-11 19:48:02

Jest to łatwy sposób na przedstawienie wiadomości, Jeśli jakiekolwiek dane są wprowadzane do formularza, a nie Wyświetlanie wiadomości, Jeśli formularz jest złożony:

$(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;
    });
})
 11
Author: Carl G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-03 18:44:52

Dla nowych ludzi, którzy szukają prostego rozwiązania, po prostu spróbuj Areyousure.js

 11
Author: lawphotog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 15:51:20

Do rozwinięcia na Keith ' s already amazing answer :

Niestandardowe komunikaty ostrzegawcze

Aby umożliwić niestandardowe komunikaty ostrzegawcze, możesz zawinąć je w funkcję taką jak:

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;
}

Następnie po prostu wywołaj tę funkcję z niestandardową wiadomością:

preventNavigation("Baby, please don't go!!!");

Ponowne włączenie nawigacji

Aby ponownie włączyć nawigację, wystarczy ustawić window.onbeforeunload na null. Oto ona, owinięta w zgrabną, małą funkcję, którą można wywołać w dowolnym miejscu:

function enableNavigation() {
    window.onbeforeunload = null;
}

Używanie jQuery aby powiązać to z elementami formularza

Jeśli używasz jQuery, można to łatwo powiązać ze wszystkimi elementami formularza takiego jak:

$("#yourForm :input").change(function() {
    preventNavigation("You have not saved the form. Any \
        changes will be lost if you leave this page.");
});

Następnie, aby umożliwić złożenie formularza:

$("#yourForm").on("submit", function(event) {
    enableNavigation();
});

Formularze dynamicznie modyfikowane:

preventNavigation() i enableNavigation() mogą być powiązane z dowolnymi innymi funkcjami w razie potrzeby, takimi jak dynamiczna modyfikacja formularza lub kliknięcie przycisku, który wysyła żądanie AJAX. Zrobiłem to, dodając ukryty element wejściowy do formularza:

<input id="dummy_input" type="hidden" />

Wtedy za każdym razem I aby uniemożliwić użytkownikowi nawigację, uruchamiam zmianę na tym wejściu, aby upewnić się, że preventNavigation() zostanie wykonana:

function somethingThatModifiesAFormDynamically() {

    // Do something that modifies a form

    // ...
    $("#dummy_input").trigger("change");
    // ...
}
 7
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Tutaj spróbuj to działa 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>
 3
Author: Braydon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 18:21:44

Gdy użytkownik zacznie wprowadzać zmiany w formularzu, zostanie ustawiony znacznik logiczny. Jeśli użytkownik spróbuje odsunąć się od strony, Zaznacz tę flagę w oknie .Zdarzenie onunload. Jeśli flaga jest ustawiona, wyświetlana jest wiadomość, zwracając ją jako ciąg znaków. Zwrócenie wiadomości jako ciągu znaków spowoduje wyświetlenie okna dialogowego potwierdzenia zawierającego Twoją wiadomość.

Jeśli używasz ajax do zatwierdzania zmian, możesz ustawić flagę na false po zatwierdzeniu zmian (np. w ajax success event).

 2
Author: Kirtan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-13 13:03:00

Możesz dodać zdarzenie onchange do pola textarea (lub dowolnych innych pól), które ustawia zmienną w JS. Gdy użytkownik próbuje zamknąć stronę (window.onunload) sprawdzasz wartość tej zmiennej i odpowiednio wyświetlasz alert.

 1
Author: Makram Saleh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-13 13:03:06

Bazując na wszystkich odpowiedziach w tym wątku, napisałem poniższy kod i zadziałał dla mnie.

Jeśli masz tylko niektóre znaczniki input/textarea, które wymagają sprawdzenia zdarzenia onunload, możesz przypisać atrybuty danych HTML5 jako data-onunload="true"

Dla np.

<input type="text" data-onunload="true" />
<textarea data-onunload="true"></textarea>

A Javascript (jQuery) może wyglądać tak:

$(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?";   
    };
});
 1
Author: Sagar Gala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-27 02:19:07

Oto mój 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>

I tak właśnie zrobiłem coś podobnego w 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!");
}
}
 1
Author: user2926228,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 08:14:04

Standardowe Stany można kontrolować poprzez anulowanie zdarzenia beforeunload lub ustawienie wartości zwracanej na wartość inną niż null . Stwierdza również, że autorzy powinni używać Event.preventDefault () zamiast returnValue, a wiadomość wyświetlana użytkownikowi nie jest konfigurowalna .

Od wersji 69.0.3497.92 Chrome nie spełnia standardu. Jednak istnieje zgłoszenie błędu, a przegląd jest w toku. Chrome wymaga returnValue ma być ustawione przez odniesienie do obiektu event, a nie wartość zwracaną przez funkcję obsługi.

Obowiązkiem autora jest śledzenie, czy zmiany zostały wprowadzone; można to zrobić za pomocą zmiennej lub upewniając się, że zdarzenie jest obsługiwane tylko wtedy, gdy jest to konieczne.

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';
 1
Author: Trevor Karjanis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-16 22:43:23

Można to łatwo zrobić, ustawiając ChangeFlag na true, na onChange Zdarzenie TextArea. Użyj javascript, aby wyświetlić okno dialogowe potwierdź na podstawie wartości ChangeFlag . Odrzuć formularz i przejdź do żądanej strony, Jeśli potwierdź zwróci true, w przeciwnym razie nie rób nic.

 0
Author: simplyharsh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-13 13:08:49

To, czego chcesz użyć, to zdarzenie onunload w JavaScript.

Oto przykład: http://www.w3schools.com/jsref/event_onunload.asp

 0
Author: waqasahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-19 19:47:28

Istnieje parametr" onunload " dla tagu body, z którego można wywoływać funkcje javascript. Jeśli zwróci false, uniemożliwia nawigację.

 -1
Author: stribika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-13 13:01:58