2012-04-22 8 views
11

Pracuję nad czatem i próbuję ustalić, w jaki sposób mogę wykryć, że użytkownik opuścił stronę. Prawie wszystko jest obsługiwane przez bazę danych, aby uniknąć problemów z front-endem.AJAX i użytkownik opuszczający stronę

Więc próbuję zrobić to, gdy strona zostanie z jakiegokolwiek powodu (zamknięcie okna, przejście do innej strony, kliknięcie łącza, itp.) Wywołanie ajax zostanie odpalone zanim dana osoba opuści, więc mogę zaktualizuj bazę danych.

To co próbowałem:

$(window).unload(function(){ 
     $.post("script.php",{key_leave:"289583002"}); 
}); 

Z jakiegoś dziwnego powodu, to nie będzie działać, a ja sprawdziłem kodu php, i to działa dobrze. Jakieś sugestie?

+0

Możliwy duplikat [JavaScript, przeglądarki, okna blisko - wysłanie żądania AJAX lub uruchomić skrypt na zamknięciu okna] (http://stackoverflow.com/questions/6162188/javascript-browsers-window -close-send-a-ajax-request-or-run-a-script-na-win) –

Odpowiedz

31

Spróbuj tego:

$(window).unload(function(){ 
    $.ajax({ 
     type: 'POST', 
     url: 'script.php', 
     async:false, 
     data: {key_leave:"289583002"} 
    }); 
}); 

Zanotuj async:false, tamtędy przeglądarka czeka na żądanie, aby zakończyć.

Używanie $.post jest asynchroniczne, więc żądanie może nie być wystarczająco szybkie, zanim przeglądarka przestanie wykonywać skrypt.

+0

Niesamowita chora, dajcie temu szansę! – Majo0od

+0

Moja dobroć zadziałała! Dziękuję bardzo, nauczyłem się czegoś nowego dzisiaj :-) – Majo0od

+0

Nie ma za co :) – stewe

1

Spróbuj dodać wyskakujące okienko (monit ("zostawiając tak wcześnie?")) Po $ .post. To może działać. Może to być złe wrażenia użytkownika. :)

+0

Nie działa .... – Majo0od

+0

Wątpię, czy będzie działać z każdą odmianą, wiele przeglądarek ma inne zasady, gdy przeglądarka jest zamykanie lub tylko zakładka się zamyka, a nawet URL strony jest przekierowywany do innego adresu URL. Największy problem polega na tym, że kiedy strona "zamyka" wszystkie połączenia i inne rzeczy są usuwane! Więc nawet wysyłasz żądanie POST kilka milisekund zanim strona zostanie usunięta, istnieje duża szansa, że ​​połączenie zostanie przerwane ... Dlatego właśnie zasugerowałem, abyś użył polecenia po wywołaniu funkcji $ .post. Spróbuję stworzyć próbkę, ale nie mogę nic obiecać. –

3

To nie jest prawidłowy sposób wykonania tej czynności. Załóżmy, że system się zawiesił lub coś się dzieje w procesie przeglądarki, więc to wydarzenie nie zostanie uruchomione. I nigdy nie dowiesz się, kiedy użytkownik opuścił witrynę, pokazując go online po rozłączeniu. Zamiast tego, możesz zrobić.

  1. Spróbuj podłączyć gniazdo, tak aby można było wiedzieć, użytkownik jest odłączony, gdy gniazdo jest odłączony
  2. można wysłać żądanie do serwera (powiedzmy po każdym 1 sek), tak aby można było wiedzieć, że użytkownik jest nadal podłączony. Jeśli nie otrzymałeś prośby - nawet po 2 sekundach - odłącz użytkownika.
+0

Nie wiem, jak to zrobić, czy masz przykład? – Majo0od

+0

co używasz po stronie serwera? asp.net? –

+1

Używa PHP. Oto ładne źródło, które może pomóc w uruchomieniu https://github.com/nicokaiser/php-websocket Również ma obiekt SWF do implementacji gniazd dla przeglądarek, które nie obsługują socketów sieciowych. –

0

Jest to związane z odpowiedzią powyżej. https://stackoverflow.com/a/10272651/1306144

Spowoduje to wykonanie wywołania ajax co 1 sekundę. (1000)

function callEveryOneSec() { 
    $jx.ajax({}); // your ajax call 
} 

setInterval(callEveryOneSec, 1000); 
+1

Myślę, że wysyłanie AJAX co sekundę może zabić serwer, gdy będzie wielu użytkowników ... – Siper

Powiązane problemy