2013-04-03 11 views
7

Używam JQuery do przechwytywania zdarzenia zwolnienia, gdy użytkownik nawiguje z dala od strony. Działa to dobrze, ale mam dane, które należy zapisać tylko w przypadku, gdy użytkownik chce odejść.Uruchamiaj kod JavaScript tylko, jeśli funkcja 'beforeunload' zwraca true

Oto mój catch-22. Jeśli zapisuję kod zbyt wcześnie, a użytkownik nie chce odejść, zepsułem stan usługi internetowej wspierającej kod.

W związku z tym muszę wykonać prawie niemożliwe do pokonania zadanie wykonywania kodu tylko wtedy, gdy okno dialogowe "beforeunload" zwraca wartość true.

$(window).on('beforeunload', function(e) { 
    var info = * some info to save the current page state * 
    return 'Are you sure you want to navigate away from the Test Runner?'; 

    //unreachable place where I wish I could ajax 'info' back to safety 
}); 

Ten kod jak to pojawi się okno dialogowe z pytaniem „Czy na pewno chcesz nawigować od androidów test?” a jeśli użytkownik kliknie przycisk Anuluj, uniemożliwi użytkownikowi opuszczenie strony.

Oto kolejna myśl:

$(window).on('onunload', function(e) { 
    var info = * some info to save the current page state * 
    var r=confirm('Are you sure you want to stop the Test Runner?'); 
    if(r==true) 
    { 
     //place where I wish I could ajax 'info' back to safety 
     return 'leaving' 
    } 
    else 
     return 'leaving unsaved'; 
}); 

Ta druga metoda nie uniemożliwić użytkownikowi pozostawienie obu kierunkach, ale w jednym przypadku będzie wykonywał najpierw niektóre zapisać kod, a drugi uruchamia je z powrotem do zimno. Problem z tym podejściem polega na tym, że większość przeglądarek (słusznie) uniemożliwia uruchamianie skrzynek potwierdzających w stanie window.onunload, dzięki wieloletnim programistom sieci z lat 90. niewidomym dla biednych internautów.

Zastrzeżenie:jestem w pełni świadoma, że ​​w społeczności internetowej dewelopera mocno zniechęcić uniemożliwiając użytkownikowi pozostawiając stronę i wykonywania kodu w tle, jak starają się to zrobić. Kiedy widzę pytania takie jak: "Jak uniemożliwić użytkownikowi opuszczenie mojej naprawdę niesamowitej strony internetowej" , moja reakcja odruchowo jest "nie rób tego!" To powiedziało, że jest inaczej. Jest to wyspecjalizowana strona dla konkretnego klienta i potrzebujemy tego jako środka zapobiegającego paniki. Jestem jednym z dobrych chłopaków, obiecuję. Jestem Tobą.

+1

Co o zapisaniu danych okresowo małe pęknięcia/tło? W ten sposób wystarczy wywołać funkcję save() w powyższym module obsługi zdarzeń. Podobny do sposobu, w jaki gmail zapisuje tymczasowo wiadomości e-mail w folderze wersji roboczej podczas pisania .. – Amitd

+0

Plus jeden dla dobrego pomysłu, ale niestety nie opcja w tym przypadku: – darkpbj

Odpowiedz

7

Spróbuj użyć obu wydarzeń. Potrzebna jest zmienna współdzielona w tym samym zakresie, nie mówiąc o zmiennej globalnej. onbeforeunload zostanie uruchomiony przed wyświetleniem okna dialogowego. onunload zostanie uruchomiony tylko wtedy, gdy użytkownik kliknie, aby opuścić okno/kartę.

// Use a variable in the same scope of both events: 
var savedState; 

$(window).on('beforeunload', function(e) { 

    savedState = "what the user currently made"; 

    return "Sure U are?"; 
}); 

$(window).on('unload', function(e) { 

    // user didn't save!! 
    // your auto-save function: 
    auto_save(savedState); 

    // browser leaves this tab. 
}); 

W zakresie, mam na myśli coś takiego lub jakiegokolwiek innego (function() { })(); (konstruktora lub funkcjonalnej) funkcji.

+0

Dzięki, że to zrobiło! – darkpbj

+0

Działa odświeżanie strony, ale kiedy zamykam kartę funkcja auto_Save nie wywołuje –

4

Testowane i działające w chrome.

$(window).on('beforeunload', function() { 
    return 'Are you sure you want to navigate away from the Test Runner?'; 
}); 
$(window).on('unload', function() { 
    $.ajax({ url: '/default.aspx', async: false }); 
}); 
+0

Testowane również na chrome, firefox i ie10-7. Głosuję za poprawne wykonanie, ale przyjmuję odpowiedź metadynów, ponieważ jest ona nieco bardziej specyficzna dla mojej aplikacji – darkpbj

1

Wystarczy napotkał co się przeżywa teraz

poniżej linku jest dobrym odniesienia do tej kwestii.

https://developer.mozilla.org/en-US/docs/Web/Events/unload

„Dokument jest w danym stanie:

  • wszystkie zasoby nadal istnieje (img, iframe itp)
  • nic nie jest już widoczna dla użytkownika końcowego
  • Interakcje interfejsu użytkownika są nieskuteczne (window.open, alert, confirm etc.)
  • błąd nie zatrzyma obieg rozładunku”

tak nie będziecie w stanie odpalić coś po beforepageunload ponieważ nie daje żadnej wartości zwracanej

Powiązane problemy