2013-05-01 56 views
33

Đoạn mã sau sẽ thực hiện cảnh báo nếu bạn thay đổi dữ liệu trên trang rồi rời khỏi trang. Tôi muốn điều đó - trừ khi người dùng nhấn nút lưu.jquery cảnh báo nếu rời khỏi trang mà không nhấp vào nút lưu

Đây là mã jquery:

$(document).ready(function() { 
    formmodified=0; 
    $('form *').change(function(){ 
     formmodified=1; 
    }); 
    window.onbeforeunload = confirmExit; 
    function confirmExit() { 
     if (formmodified == 1) { 
      return "New information not saved. Do you wish to leave the page?"; 
     } 
    } 
}); 

Đây là nút đó lưu các dữ liệu:

<input class="btn-primary" name="commit" type="submit" value="Save Material"> 

CẬP NHẬT Cảm ơn tymeJV !!!!!!!

Trong trường hợp ai đó cần nó, công trình này:

$(document).ready(function() { 
    formmodified=0; 
    $('form *').change(function(){ 
     formmodified=1; 
    }); 
    window.onbeforeunload = confirmExit; 
    function confirmExit() { 
     if (formmodified == 1) { 
      return "New information not saved. Do you wish to leave the page?"; 
     } 
    } 
    $("input[name='commit']").click(function() { 
     formmodified = 0; 
    }); 
}); 
+2

là 'formmodified' chỉ được sử dụng trong suốt thời gian của trang? Và không được thông qua? Nếu vậy, sau đó chỉ cần đặt nó là 0 onclick của nút Save, hoặc onsubmit của biểu mẫu. – MasNotsram

+0

Không chắc chắn tôi hiểu, bạn muốn cảnh báo rằng thông tin KHÔNG được lưu khi bạn nhấp vào nút lưu? –

+0

@ColinBacon Tôi tin rằng anh ấy muốn nó để nếu anh ta nhấp vào nút lưu, không hiển thị cảnh báo ở cuối về việc lưu. – tymeJV

Trả lời

19

Với bạn lưu thông tin nút:

<input class="btn-primary" name="commit" type="submit" value="Save Material"> 

Bạn có thể thiết lập giá trị của formmodified

$("input[name='commit']").click(function() { 
    formmodified = 0; 
}); 

Séc của bạn cuối cùng không được kích hoạt ngay bây giờ

+0

Cảm ơn sự giúp đỡ! – Reddirt

+0

Hoạt động như một sự quyến rũ. Và chúng tôi thực sự không cần dòng cuối cùng "Bạn có chắc chắn muốn rời khỏi trang không?" vì điều này dường như không thể thiếu trong lời nhắc xác nhận của trình duyệt (ít nhất là Chrome). – cbmtrx

+0

Hmm, có lẽ tôi đã nói quá sớm, @tymeJV. Có vẻ như - trên Chrome, ít nhất - 'window.onbeforeunload' gọi hàm' confirmExit() 'trước khi bấm vào nút 'input.commit' được đăng ký. Vì vậy, nó bật cảnh báo ngay cả khi gửi biểu mẫu. – cbmtrx

6
$('#form').data('serialize',$('#form').serialize()); // On load save form current state 

$(window).bind('beforeunload', function(e){ 
    if($('#form').serialize()!=$('#form').data('serialize'))return true; 
    else e=null; // i.e; if form state change show box not. 
}); 

Bạn có thể sử dụng chức năng Google JQuery Form Serialize, thao tác này sẽ thu thập tất cả các mục nhập biểu mẫu và lưu vào mảng. Tôi đoán giải thích này là đủ :)

+0

Một số giải thích cho giải pháp sẽ giúp và cộng thêm bạn có thể kiếm được nhiều hơn từ nó. – suspectus

+0

ok, cảm ơn đề xuất của bạn, tôi đã làm. –

3

Đây không phải là câu trả lời chính xác cho câu hỏi trên nhưng để tham khảo cho những người đang tìm kiếm giải pháp cho vấn đề 'thông báo cho người dùng về thay đổi biểu mẫu chưa được lưu' như tôi, tôi ' d muốn giới thiệu plugin jQuery AreYouSure. Plugin rất nhẹ này xử lý tất cả các loại hạt và chữ in đậm như thay đổi hình thức hoàn nguyên, nhấp vào nút đặt lại biểu mẫu, thêm/xóa các trường biểu mẫu, v.v. mà không cần phải lo lắng gì thêm.

0

Nếu bạn muốn ngăn chặn trang rời khỏi khi một liên kết được nhấp, bạn có thể liên kết với các sự kiện beforeunload và vượt qua e trong:

$(document).ready(function() { 
    var modified = false; 
    $(window).bind('beforeunload', function(e){ 
     if (modified) { 
      $.confirm({ 
       'title' : 'Did You Save Your Changes?', 
       'message' : 'It seems as if you have made changes but didn\'t click Save.\nAre you sure you want to leave the page?', 
       'buttons' : { 
        'OK' : { 
         'class' : 'gray', 
         'action': function(){} // Nothing to do in this case. This can be omitted if you prefer. 
        } 
       }) 
      } 
      e.preventDefault(); 
     } 
    }); 
});  
+0

Doest không hoạt động cho tôi: nhấp vào bất kỳ liên kết nào hoặc nhấn tải lại trong trình duyệt, chỉ cần mở/tải lại trang. – Fabien

+1

Từ https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload: "Kể từ ngày 25 tháng 5 năm 2011, đặc tả HTML5 nêu rõ các lệnh gọi đến window.alert(), window.confirm () và các phương thức window.prompt() có thể bị bỏ qua trong sự kiện này. Xem đặc tả HTML5 để biết thêm chi tiết. " – dieend

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