Muszę ostrzec użytkowników przed niezapisanymi zmianami, zanim opuszczą stronę (dość powszechny problem).
window.onbeforeunload=handler
To działa, ale wywołuje domyślne okno dialogowe z irytującą standardową wiadomością, która otacza mój własny tekst. Muszę albo całkowicie zastąpić standardowy komunikat, aby mój tekst był wyraźny, albo (jeszcze lepiej) zastąpić całe okno dialogowe modalnym oknem dialogowym za pomocą jQuery.
Jak dotąd zawiodłem i nie znalazłem nikogo, kto wydaje się mieć odpowiedź. Czy to w ogóle możliwe?
JavaScript na mojej stronie:
<script type="text/javascript">
window.onbeforeunload=closeIt;
</script>
Funkcja closeIt ():
function closeIt()
{
if (changes == "true" || files == "true")
{
return "Here you can append a custom message to the default dialog.";
}
}
Używając jQuery i jqModal Próbowałem tego rodzaju rzeczy (używając niestandardowego okna dialogowego potwierdzenia):
$(window).beforeunload(function() {
confirm('new message: ' + this.href + ' !', this.href);
return false;
});
co również nie działa - nie mogę się powiązać ze zdarzeniem beforeunload.
javascript
jquery
onbeforeunload
ciało
źródło
źródło
Odpowiedzi:
Nie możesz zmodyfikować domyślnego okna dialogowego
onbeforeunload
, więc najlepszym rozwiązaniem może być praca z nim.Oto odniesienie do tego od Microsoft:
Problemem wydaje się być:
onbeforeunload
jest wywoływany, przyjmuje wartość zwracaną przez moduł obsługi jakowindow.event.returnValue
.false
parsowany jako ciąg znaków, uruchomi się okno dialogowe, które następnie przekaże odpowiednietrue
/false
.Wynik jest, nie wydaje się być sposób przypisywania
false
abyonbeforeunload
zapobiec jej z domyślnym dialogu.Dodatkowe uwagi na temat jQuery:
onbeforeunload
na wystąpienie innych zdarzeń. Jeśli chcesz, aby wystąpiło tylko zdarzenie rozładowania, trzymałbym się za to zwykłego kodu JavaScript.jQuery nie ma skrótu,
onbeforeunload
więc musisz użyć ogólnejbind
składni.Edytuj 09.04.2018 : niestandardowe komunikaty w oknach dialogowych onbeforeunload są przestarzałe od chrome-51 (por. Uwaga do wydania )
źródło
To, co działało dla mnie, używając jQuery i przetestowane w IE8, Chrome i Firefox, to:
Ważne jest, aby niczego nie zwracać, jeśli monit nie jest wymagany, ponieważ występują tutaj różnice między IE a innymi zachowaniami przeglądarki.
źródło
event.returnValue
to jedyna „zatwierdzona” metoda w IE. IE mówi dalej: „Wartość tej właściwości ma pierwszeństwo przed wartościami zwracanymi przez funkcję, na przykład za pomocą instrukcji return Microsoft JScript”. .. byłoby miło zobaczyć gwarantowaną korelację międzyreturn
(z zdarzenia) aevent.returnValue
..Chociaż w niektórych okolicznościach nie można nic zrobić z tym pudełkiem, możesz przechwycić osobę klikającą link. Dla mnie było to warte wysiłku w przypadku większości scenariuszy i jako awarię opuściłem zdarzenie odciążające.
Użyłem Boxy zamiast standardowego okna dialogowego jQuery, jest on dostępny tutaj: http://onehackoranother.com/projects/jquery/boxy/
Możesz dołączyć do innego wydarzenia i filtrować więcej na temat tego, jaki rodzaj kotwicy został kliknięty, ale to działa dla mnie i co chcę zrobić i służy jako przykład dla innych do wykorzystania lub ulepszenia. Pomyślałem, że podzielę się tym dla tych, którzy chcą tego rozwiązania.
Mam wycięty kod, więc może nie działać tak jak jest.
źródło
1) Użyj onbeforeunload, a nie onunload.
2) Ważne jest, aby unikać wykonywania instrukcji return. Nie mam przez to na myśli uniknięcia powrotu od twojego przewodnika. Zwracasz wszystko w porządku, ale robisz to, upewniając się, że dotarłeś do końca funkcji i NIE wykonujesz instrukcji return. W tych warunkach wbudowane standardowe okno dialogowe nie występuje.
3) Jeśli korzystasz z opcji onbeforeunload, możesz uruchomić wywołanie ajax w swoim module obsługi unbeforeunload, aby uporządkować serwer, ale musi to być synchroniczny i musisz poczekać i obsłużyć odpowiedź w module obsługi onbeforeunload (nadal szanując warunek (2) powyżej). Robię to i działa dobrze. Jeśli wykonasz synchroniczne wywołanie ajax, wszystko zostanie wstrzymane do momentu powrotu odpowiedzi. Jeśli zrobisz asynchroniczny, myśląc, że nie zależy ci na odpowiedzi z serwera, odciążanie strony będzie kontynuowane, a twoje wywołanie ajax zostanie przerwane przez ten proces - włączając zdalny skrypt, jeśli jest uruchomiony.
źródło
Spróbuj wstawić
return;
zamiast wiadomości. Działa to w większości przeglądarek. (To tylko naprawdę zapobiega prezentom dialogowym)źródło
null
otworzy się okno dialogowe z tekstem „null”. Jednakreturn void(0);
nie otworzy okna dialogowego.Nie można tego teraz zrobić w chrome, aby uniknąć spamowania, więcej szczegółów można znaleźć w javascript onbeforeunload, który nie wyświetla niestandardowej wiadomości .
źródło
Możesz wykryć, który przycisk (OK lub Anuluj) został naciśnięty przez użytkownika, ponieważ funkcja onunload wywoływana jest tylko wtedy, gdy użytkownik zdecyduje się opuścić stronę. Mimo to w tej funkcji możliwości są ograniczone, ponieważ DOM jest zawalony. Możesz uruchomić javascript, ale POST ajax nic nie robi, dlatego nie możesz użyć tej metody do automatycznego wylogowania. Ale istnieje na to rozwiązanie. Window.open ('logout.php') wykonane w funkcji onunload, więc użytkownik wyloguje się z nowym otwarciem okna.
Ten kod jest wywoływany, gdy użytkownik opuszcza stronę lub zamyka aktywne okno, a użytkownik wylogował się z pliku „logout.php”. Nowe okno zamyka się natychmiast po wylogowaniu php z kodu:
źródło
Napotkałem ten sam problem, mogłem uzyskać własne okno dialogowe z moją wiadomością, ale problem, z którym się spotkałem, to: 1) Dał komunikat na wszystkich nawigacjach, które chcę tylko dla kliknięcia. 2) z własnym komunikatem potwierdzającym, jeśli użytkownik wybierze opcję Anuluj, nadal wyświetla domyślne okno dialogowe przeglądarki.
Poniżej znajduje się kod rozwiązania, który znalazłem, który napisałem na mojej stronie wzorcowej.
źródło
odnoszą się z http://www.codeprojectdownload.com
źródło
Co powiesz na użycie specjalnej wersji polecenia „bind” „one”. Gdy procedura obsługi zdarzeń zostanie wykonana po raz pierwszy, jest automatycznie usuwana jako procedura obsługi zdarzeń.
źródło
.one()
- dołącza detektor zdarzeń, aby nasłuchiwać zdarzenia tylko raz: „Dołącz moduł obsługi do zdarzenia dla elementów. Moduł obsługi jest wykonywany najwyżej raz dla elementu na typ zdarzenia”. api.jquery.com/onePodejście kątowe 9:
Obsługa przeglądarek i usuwanie niestandardowego komunikatu:
źródło