2009-11-09 32 views
102

Khi chỉnh sửa trang trong hệ thống của tôi, người dùng có thể quyết định điều hướng đến một trang web khác và làm như vậy có thể mất tất cả các chỉnh sửa mà họ chưa lưu.Sự kiện thoát khỏi trang chặn

Tôi muốn chặn mọi nỗ lực truy cập trang khác và nhắc người dùng chắc chắn rằng họ muốn điều này xảy ra vì họ có khả năng mất công việc hiện tại của họ.

Gmail thực hiện việc này theo cách tương tự. Ví dụ: soạn email mới, bắt đầu nhập vào nội dung tin nhắn và nhập vị trí mới vào thanh địa chỉ (nói twitter.com hoặc gì đó). Nó sẽ hỏi "Bạn có chắc không?"

Ý tưởng cách sao chép nội dung này? Tôi đang nhắm mục tiêu IE8, nhưng cũng muốn tương thích với FF & Chrome.

+6

http://stackoverflow.com/questions/147636/best-way-to-detect-when-user-leaves-a-web-page –

Trả lời

127

Tương tự như câu trả lời Ghommey, nhưng điều này cũng hỗ trợ các phiên bản cũ của trình duyệt IE và Firefox.

window.onbeforeunload = function (e) { 
    var message = "Your confirmation message goes here.", 
    e = e || window.event; 
    // For IE and Firefox 
    if (e) { 
    e.returnValue = message; 
    } 

    // For Safari 
    return message; 
}; 
+1

Bạn có thể giải thích dòng đầu tiên (var message = ...) không? Tôi không biết những gì mà dấu phẩy và biểu thức thứ hai đang làm. – mtmurdock

+7

@mtmurdock Đó chỉ là cú pháp Javascript để khai báo nhiều biến. 'var foo, bar; ' giống như ' var foo;' 'var bar;' –

+4

@mtmurdock, Câu lệnh thứ hai "_var_ e = e || window.event;" có nghĩa là thiết lập ** e ** bằng tham số _e_ (nếu nó là sự thật) hoặc window.event nếu không đúng sự thật. Nó sẽ không trung thực nếu tham số _e_ là null. –

21

Xem bài viết này. Các tính năng mà bạn đang tìm kiếm là onbeforeunload

mẫu mã:

<script language="JavaScript"> 
    window.onbeforeunload = confirmExit; 
    function confirmExit() 
    { 
    return "You have attempted to leave this page. If you have made any changes to the fields without clicking the Save button, your changes will be lost. Are you sure you want to exit this page?"; 
    } 
</script> 
+2

Có cách nào để xác định người dùng đã chọn các " Để trang này "tùy chọn thay vì" Ở lại trang này "? –

3

Thay vì một popup xác nhận gây phiền nhiễu, nó sẽ được tốt đẹp để chậm trễ rời chỉ là một chút (vài mili giây) để quản lý thành công đăng các dữ liệu chưa được lưu vào máy chủ, mà tôi quản lý cho trang web của tôi sử dụng bằng văn bản văn bản giả để giao diện điều khiển như thế này:

window.onbeforeunload=function(e){ 
    // only take action (iterate) if my SCHEDULED_REQUEST object contains data   
    for (var key in SCHEDULED_REQUEST){ 
    postRequest(SCHEDULED_REQUEST); // post and empty SCHEDULED_REQUEST object 
    for (var i=0;i<1000;i++){ 
     // do something unnoticable but time consuming like writing a lot to console 
     console.log('buying some time to finish saving data'); 
    }; 
    break; 
    }; 
}; // no return string --> user will leave as normal but data is send to server 

Edit: Xem thêm Synchronous_AJAX và làm thế nào để làm điều đó với jquery

+0

Tôi thích lựa chọn này cho cửa sổ bật lên . Cảm ơn lời đề nghị, Remi. –

+1

không hoàn toàn có ý nghĩa -1.javascript là không threaded những gì bạn đang làm là làm một postRequest và sau đó tạm dừng tính toán của trang web mà không cho phép không ai làm gì cả (bao gồm cả postRequest của bạn, trong khi đó đã được gửi trước khi tạm dừng tính toán). – fmsf

+0

Và đó chính xác là lý do tại sao nó hoạt động: thực sự yêu cầu được gửi trước khi tính toán tạm dừng, nhưng việc chặn trang này trước khi nó thực sự đảm bảo đủ thời gian cho trình duyệt (không phải javascript) để thực sự hoàn tất việc gửi yêu cầu này đúng. Tôi nhận thấy rằng khi tôi chỉ gửi yêu cầu (không chặn) và rời khỏi trang ngay sau đó, yêu cầu không phải lúc nào cũng gửi. – Remi

0

Tôi có người dùng chưa hoàn thành tất cả dữ liệu bắt buộc.

<cfset unloadCheck=0>//a ColdFusion precheck in my page generation to see if unload check is needed 
var erMsg=""; 
$(document).ready(function(){ 
<cfif q.myData eq ""> 
    <cfset unloadCheck=1> 
    $("#myInput").change(function(){ 
     verify(); //function elsewhere that checks all fields and populates erMsg with error messages for any fail(s) 
     if(erMsg=="") window.onbeforeunload = null; //all OK so let them pass 
     else window.onbeforeunload = confirmExit(); //borrowed from Jantimon above; 
    }); 
}); 
<cfif unloadCheck><!--- if any are outstanding, set the error message and the unload alert ---> 
    verify(); 
    window.onbeforeunload = confirmExit; 
    function confirmExit() {return "Data is incomplete for this Case:"+erMsg;} 
</cfif> 
Các vấn đề liên quan