2012-04-22 36 views
11

Tôi đang trò chuyện và tôi đang cố gắng tìm hiểu cách tôi có thể phát hiện thấy người dùng đã rời trang hay chưa. Hầu như tất cả mọi thứ đang được xử lý bởi cơ sở dữ liệu để tránh kết thúc trước từ rối tung lên.AJAX và người dùng rời khỏi trang

Vì vậy, những gì tôi đang cố gắng làm là khi trang còn lại vì bất kỳ lý do nào (cửa sổ đóng, chuyển đến trang khác, nhấp vào liên kết, v.v.) cuộc gọi ajax sẽ được kích hoạt trước khi một người rời đi để tôi có thể cập nhật cơ sở dữ liệu.

Đây là những gì tôi đã cố gắng:

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

Đối với một số lý do kỳ quặc, nó sẽ không làm việc, và tôi đã kiểm tra mã php, và nó hoạt động tốt. Bất kỳ đề xuất?

+0

Có thể trùng lặp [JavaScript, trình duyệt, đóng cửa sổ - gửi yêu cầu AJAX hoặc chạy tập lệnh khi đóng cửa sổ] (http://stackoverflow.com/questions/6162188/javascript-browsers-window –

Trả lời

31

Hãy thử điều này:

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

Lưu ý async:false, cách mà trình duyệt phải đợi cho yêu cầu để kết thúc.

Sử dụng $.post không đồng bộ, do đó yêu cầu có thể không đủ nhanh trước khi trình duyệt ngừng thực thi tập lệnh.

+0

Tuyệt vời bị bệnh cho nó một đi! – Majo0od

+0

Lòng tốt của tôi đã hoạt động! Cảm ơn bạn rất nhiều, đã học được điều gì đó mới hôm nay :-) – Majo0od

+0

Bạn được chào đón :) – stewe

1

Hãy thử thêm cửa sổ bật lên (lời nhắc ("rời sớm"?)) Sau $ .post. Nó có thể hoạt động. Tho nó có thể là trải nghiệm người dùng tồi tệ. :)

+0

Không hoạt động .... – Majo0od

+0

Tôi nghi ngờ nó sẽ hoạt động với bất kỳ biến thể nào, nhiều trình duyệt có các chính sách khác nhau khi trình duyệt là đóng hoặc chỉ tab đang đóng hoặc thậm chí trang url được chuyển hướng đến url khác. Vấn đề lớn nhất ở đây là khi trang là "đóng" tất cả các kết nối và các công cụ khác được xử lý! Vì vậy, ngay cả khi bạn gửi yêu cầu POST vài phần nghìn giây trước khi trang được xử lý thì có nhiều khả năng kết nối đó sẽ bị chấm dứt ... Đó là lý do tại sao tôi đề xuất bạn sử dụng lời nhắc sau lệnh gọi hàm $ .post. Tôi sẽ cố gắng tạo mẫu nhưng tôi không thể hứa gì cả. –

3

Đây không phải là cách đúng để thực hiện việc này ... Giả sử hệ điều hành bị treo hoặc xảy ra sự cố trong quá trình trình duyệt thì sự kiện này sẽ không được kích hoạt. Và bạn sẽ không bao giờ biết khi nào người dùng rời đi, hiển thị trực tuyến anh ấy/cô ấy sau khi anh ấy/cô ấy đã ngắt kết nối. Thay vào đó, những gì bạn có thể làm là.

  1. Hãy thử kết nối một ổ cắm để bạn có thể biết người dùng bị ngắt kết nối khi các ổ cắm bị ngắt kết nối
  2. Bạn có thể gửi một yêu cầu đến máy chủ (nói sau mỗi 1 giây) để bạn có thể biết rằng người dùng vẫn được kết nối. Nếu bạn không nhận được yêu cầu - ngay cả sau 2 giây - hãy ngắt kết nối người dùng.
+0

Tôi không biết làm thế nào để làm điều đó, bạn có một ví dụ? – Majo0od

+0

những gì bạn đang sử dụng phía máy chủ? asp.net? –

+1

Anh ấy đang sử dụng PHP. Dưới đây là nguồn tốt đẹp mà có thể giúp bạn bắt đầu https://github.com/nicokaiser/php-websocket Ngoài ra nó có đối tượng SWF để thực hiện socket cho các trình duyệt mà không hỗ trợ web sockects. –

0

Điều này liên quan đến câu trả lời ở trên. https://stackoverflow.com/a/10272651/1306144

Điều này sẽ thực hiện cuộc gọi ajax cứ sau 1 giây. (1000)

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

setInterval(callEveryOneSec, 1000); 
+1

Tôi nghĩ rằng việc gửi AJAX mỗi giây có thể giết chết máy chủ khi sẽ có nhiều người dùng ... – Siper

Các vấn đề liên quan