2013-04-10 8 views
17

Muszę wywołać funkcję JavaScript/jQuery, która zawiera kilka linii kodu, na stronie PHP, gdy użytkownik zamyka swoje okno/kartę lub nawiguje po kliknięciu łącza. Próbowałem już funkcji onbeforeunload, ale wykonywana jest tylko część return "blah blah blah;", a cała reszta jest ignorowana. Próbowałem również metody .unload z jQuery, ale z jakiegoś powodu ten kod nie działa.Wyzwalanie zdarzenia, gdy użytkownik odejdzie od użytkownika

$(window).unload(function() { 
    alert('blah blah blah'); 
}); 

Proszę sugerować alternatywy. Dzięki ..

+1

Co chcesz zrobić po rozładowaniu? – writeToBhuwan

+1

Muszę wykonać wywołanie Ajax do PHP, aby zdezaktywować zmienną sesji. –

+0

'odejdzie przez kliknięcie linku' to pokazuje, że musisz związać rozładowanie na swoim dokumencie – muneebShabbir

Odpowiedz

13

Oto prosty przykład pracy. Cokolwiek zadzwonisz return z połączenia zwrotnego unload, pojawi się w oknie potwierdzenia przeglądarki.

przykład Praca wysyłania żądania Ajax przed rozładować http://jsfiddle.net/alexflav23/hujQs/7/

Najprostszym sposobem, aby to zrobić:

window.onbeforeunload = function(event) { 
    // do stuff here 
    return "you have unsaved changes. Are you sure you want to navigate away?"; 
}; 

w jQuery:

$(window).on("beforeunload", function() { 
    $.ajax("someURL", { 
     async: false, 
     data: "test", 
     success: function(event) { 
      console.log("Ajax request executed"); 
     } 
    }); 
    return "This is a jQuery version"; 
}); 

patrzeć w karcie sieciowej przeglądarka. Zobaczysz, jak żądanie jest wysyłane, tak jak chciałeś. Po prostu wyślij odpowiednie dane.

Pamiętaj, że wszystkie operacje, które zostały uruchomione, muszą być synchroniczne, więc możesz na przykład wykonywać synchroniczne żądania ajax. Powyższe nie jest jednak całkowicie wiarygodne w żadnym celu.

Umożliwia okresowe tworzenie kopii zapasowych danych użytkownika do localStorage i automatyczną synchronizację z serwerem. Zachowaj window.onbeforeunload jako dodatkowe zabezpieczenie, ale nie jako główny mechanizm. Powszechnie wiadomo, że powoduje problemy.

+0

To nie działa. Polecenie beforeunload jest zawsze wywoływane, niezależnie od tego, czy użytkownik potwierdzi ostrzeżenie, czy nie. Muszę przeprowadzić jakieś czyszczenie, ale chcę tylko przeprowadzić czyszczenie, jeśli użytkownik RZECZYWIŚCIE odejdzie. Jak mogę to zrobić? –

+0

@JohnHenckel Nie ma sposobu, aby to zrobić. – apscience

+1

@apscience, dzięki. Wydaje się, że jest to usterka w specyfikacji przeglądarki. Na przykład chcę utworzyć stronę internetową do edycji wiersza w bazie danych i chcę ZABLOKOWAĆ wiersz, aby uniemożliwić innym użytkownikom jego zmianę. Jedynym znalezionym rozwiązaniem jest wysyłanie pulsu do serwera co kilka sekund, aby serwer wiedział, kiedy ODBLOKUĆ. Ma to jednak poważną wadę, ponieważ podczas gdy dowolne okno "potwierdzenia" jest otwarte, silnik JS jest wstrzymywany, a więc puls przestaje działać, nawet jeśli użytkownik nadal edytuje! Może kiedyś przeglądarka zastąpi system operacyjny, ale na razie jest do bani jako platforma aplikacji! –

Powiązane problemy