2013-04-10 29 views
17

Tôi cần gọi hàm JavaScript/jQuery có một vài dòng mã trong đó, trên trang PHP khi người dùng đóng cửa sổ/tab hoặc điều hướng bằng cách nhấp vào liên kết. Tôi đã thử chức năng onbeforeunload nhưng chỉ thực hiện phần return "blah blah blah;" và mọi thứ khác bị bỏ qua. Tôi cũng đã thử các phương pháp .unload từ jQuery nhưng đối với một số lý do mã này không chạy.Kích hoạt sự kiện khi người dùng điều hướng đi

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

Vui lòng đề xuất lựa chọn thay thế. Cảm ơn ..

+1

Bạn muốn làm gì khi tải xuống? – writeToBhuwan

+1

Tôi cần thực hiện cuộc gọi Ajax tới PHP để hủy đặt biến phiên. –

+0

'điều hướng đi bằng cách nhấp vào liên kết' điều này cho thấy bạn phải liên kết bỏ trên tài liệu của bạn – muneebShabbir

Trả lời

13

Đây là một ví dụ đơn giản. Bất kể bạn return từ cuộc gọi lại unload sẽ được hiển thị trong xác nhận bật lên của trình duyệt.

dụ làm việc gửi yêu cầu Ajax trước khi dỡ bỏ http://jsfiddle.net/alexflav23/hujQs/7/

Cách dễ nhất để làm điều này:

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

trong 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"; 
}); 

Nhìn vào tab Mạng của trình duyệt. Bạn sẽ thấy cách yêu cầu được gửi như bạn muốn làm. Chỉ cần gửi dữ liệu thích hợp.

Ghi nhớ tất cả các thao tác được kích hoạt phải đồng bộ, vì vậy bạn chỉ có thể thực hiện các yêu cầu ajax đồng bộ chẳng hạn. Tuy nhiên, điều trên không hoàn toàn đáng tin cậy cho bất kỳ mục đích nào.

Chọn sao lưu định kỳ dữ liệu người dùng thành localStorage và đồng bộ hóa với máy chủ tự động. Giữ window.onbeforeunload chỉ là một biện pháp phòng ngừa bổ sung, nhưng không phải là một cơ chế chính. Nó cũng được biết là gây ra vấn đề.

+0

Điều này không hoạt động. Beforeunload luôn được gọi, cho dù người dùng có xác nhận cảnh báo hay không. Tôi cần phải chạy một số dọn dẹp nhưng tôi chỉ muốn chạy sạch nếu người dùng thực sự điều hướng đi. Làm thế nào tôi có thể làm điều đó? –

+0

@JohnHenckel Không có cách nào để làm điều đó. – apscience

+1

@apscience, cảm ơn. Có vẻ như đây là một lỗ hổng trong thông số của trình duyệt. Ví dụ, tôi muốn tạo một trang web để chỉnh sửa một hàng trong cơ sở dữ liệu và tôi muốn khóa hàng để ngăn người dùng khác thay đổi nó. Giải pháp duy nhất tôi tìm thấy là gửi nhịp tim đến máy chủ cứ sau vài giây để máy chủ biết khi nào nên mở khóa. Tuy nhiên, điều này có một lỗ hổng nghiêm trọng, bởi vì trong khi bất kỳ "xác nhận" hộp được mở, động cơ JS bị tạm dừng, và do đó nhịp tim dừng lại, mặc dù người dùng vẫn đang chỉnh sửa! Có thể một ngày nào đó trình duyệt sẽ thay thế hệ điều hành, nhưng bây giờ nó hút như một nền tảng ứng dụng! –

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