2010-08-16 31 views
8

Tôi hiện đang sử dụng plugin jquery-form-observe sử dụng onbeforeunload để nhắc người dùng về các thay đổi "chưa lưu".Có thể kích hoạt sự kiện onbeforeunload theo chương trình không?

Nhưng tôi có một kịch bản mà tôi cần kích hoạt tính năng này khi nhấp vào nút: lần nhấp nút cuối cùng dẫn đến việc thay đổi trang, nhưng tôi muốn nhắc người dùng trước khi họ bắt đầu quá trình nhấp vào nút.

Vậy có cách nào để kích hoạt onbeforeunload thông qua jQuery hay không?

Trả lời

3

Tôi không biết nếu có cách trực tiếp để thực hiện việc này, nhưng bạn luôn có thể tự mình mô phỏng hộp xác nhận của trình duyệt. Dưới đây là một chức năng đơn giản tôi nấu chín lên dựa trên specs at MSDN:

function triggerBeforeUnload() { 
    var event = {}; 
    handler(event); 

    if (typeof event.returnValue == 'undefined' || 
     confirm('Are you sure you want to navigate away from this page?\n\n' + event.returnValue + '\n\nPress OK to continue, or Cancel to stay on the current page.')) { 
    // Continue with page unload 
    } else { 
    // Cancel page unload 
    } 
} 

Edit: Trong jquery.formobserver.js, ngay sau khi định nghĩa của function beforeunload(e) { ... }, thêm dòng này:

handler = beforeunload; 

Lưu ý sự thay đổi trong bản gốc mã: window.onbeforeunload đã được thay thế bằng handler.

+0

Trên cả Firefox và IE8 tôi nhận được một lỗi trên cuộc gọi đến window.onbeforeunload. Lỗi Firefox là "window.onbeforeunload không phải là một hàm" và IE quay trở lại với "Object không hỗ trợ thuộc tính hoặc phương thức này" – mutex

+0

Ok, do đó, vấn đề là plugin gắn một trình xử lý sự kiện thông qua 'addEventListener' /' attachEvent' và không trực tiếp thông qua 'window.onbeforeunload'. Tôi đoán bạn sẽ phải sửa đổi mã plugin để có tham chiếu đến hàm 'beforeunload'. – casablanca

+0

Cảm ơn!Điều đó hoạt động ngay bây giờ. Bất kỳ đề xuất về tránh sử dụng một toàn cầu cho xử lý mặc dù? – mutex

2

Bạn có thể làm điều đó với phương pháp .trigger():

$('button').click(function(){ 
    $(window).trigger('beforeunload'); 
}); 
+3

Đó là khá nhiều điều đầu tiên tôi đã cố gắng, nhưng có vẻ như kích hoạt không thể được sử dụng trên 'beforeunload' như không có gì dường như xảy ra khi tôi gọi nó. – mutex

+0

@mutex Tôi đã tự hỏi điều tương tự trước khi tôi trả lời vì vậy tôi thiết lập thử nghiệm đơn giản này: http://jsfiddle.net/LpGq9/. Có lẽ nó đã làm với cách thức quan sát hình thức plugin là ràng buộc xử lý sự kiện onbeforeunload. – Pat

+0

Có, bạn có thể đúng. Plugin không sử dụng liên kết; thay vào đó, điều này thực hiện: nếu (window.attachEvent) { window.attachEvent ('onbeforeunload', beforeunload); } nếu if (window.addEventListener) { window.addEventListener ('beforeunload', beforeunload, true); } – mutex

1

tôi stumbled trên câu hỏi này trong khi tìm kiếm câu trả lời cho câu hỏi của riêng tôi mà là tương tự như trong tự nhiên. Vì vậy, tôi đã đưa ra một cách giải quyết ở đây. Tôi cần gọi "onbeforeunload" chỉ khi người dùng nhấp vào một nút cụ thể và không ai trong số những người khác. Hy vọng rằng điều này làm sáng tỏ một số câu hỏi của bạn.

Tôi đã làm việc này ở jsfiddle. Bạn có thể kiểm tra nó trong bản demo mà tôi đã thiết lập và có thể thấy rõ rằng nó chỉ hoạt động với một trong các nút. Tuy nhiên, có một báo trước, mà tôi đã không bận tâm để tìm một sửa chữa. Nếu bạn bấm vào nút và chọn để ở lại trên trang, sau đó tất cả các nút/liên kết/chuyển hướng/tải lại tiếp theo sẽ kích hoạt "onbeforeunload" Bạn được chào đón để đến với công việc của riêng bạn xung quanh cho "lỗi" (vì thiếu tốt hơn điều khoản) để làm cho nó để nó sẽ không gây ra phản ứng đó nếu người dùng quyết định ở lại trên trang. Tuy nhiên, nó đang làm việc và thực hiện những gì bạn yêu cầu cho nó để làm trong môi trường thử nghiệm.

Dưới đây là các mã:

$(document).ready(function() { 
     $('.testButton').click(function() { 
      window.onbeforeunload = function() { 
       return "Enter your message here..."; 
      } 
     }); 
    }); 

EDIT:

Vì vậy, sau khi nghiên cứu những cách khác để làm điều tương tự, tôi đã đi qua một cách khác để buộc một sự kiện vào nút sử dụng .Trên jQuery() phương pháp. Mã có thể được nhìn thấy here, xác minh rằng mã cũ đã được nhận xét. Một lần nữa, cùng "lỗi" như trước, nhưng vẫn cung cấp chức năng được yêu cầu.

Dưới đây là giải pháp thay thế:

$(document).ready(function() { 
     $('.testButton').on("click", function (event) { 
      window.onbeforeunload = function() { 
       return "Enter your message here..."; 
      } 
     }); 
    }); 
Các vấn đề liên quan