Nếu bạn đang nói về postbacks một phần ASP.NET AJAX, sau đó tôi gặp phải hành vi này ngày hôm nay quá, làm điều tương tự. (Nếu bạn không, bỏ qua bài viết của tôi hoàn toàn.)
Theo kinh nghiệm của tôi cho đến nay, nó có vẻ như nếu postback một phần của bạn được kích hoạt bởi một đầu vào, nó sẽ không bắn onbeforeunload trong một postback một phần , nhưng nếu đăng lại một phần được kích hoạt bởi một liên kết siêu liên kết, nó sẽ hiển thị. Có vẻ như trình duyệt giả sử bạn đang điều hướng đi nếu bạn nhấp vào bất kỳ thứ gì trong thẻ neo (chỉ được thử nghiệm trong IE và FireFox nhưng vâng).
Trang có trường ẩn nhất định đã là thứ tôi đang sử dụng để xác định phía máy khách hay không khi hiển thị cảnh báo điều hướng, vì vậy tôi có thể khắc phục điều này rất đơn giản bằng cách thêm kiểm tra giá trị của trường ẩn đối với điều kiện if onbeforeunload của tôi và hooking vào trình xử lý BeginRequest và EndRequest của PageRequestManager để đặt giá trị. Điều đó có hiệu quả vô hiệu hóa cảnh báo trong một phần postbacks. Bạn có thể thêm logic phức tạp hơn ở đây nếu có nhiều thứ cụ thể hơn mà bạn muốn kiểm tra.
Đây là mẫu mã thực sự được đơn giản hóa. (. Xin lỗi nếu tôi pared và kiểm duyệt tới điểm mà nó không hoạt động nhưng nó sẽ cho bạn một ý tưởng)
window.onbeforeunload = checkNavigateAway;
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(onBeginRequest);
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest);
function onBeginRequest(sender, args) {
var navigateAwayFlag = $("input[id*='navigateAwayValue']");
if (navigateAwayFlag.length > 0) {
navigateAwayFlag[0].value = "false";
}
}
function onEndRequest(sender, args) {
var navigateAwayFlag = $("input[id*='navigateAwayValue']");
if (navigateAwayFlag.length > 0) {
navigateAwayFlag[0].value = "true";
}
}
function checkNavigateAway() {
var navigateAwayFlag = $("input[id*='navigateAwayValue']");
if (navigateAwayFlag.length > 0 && navigateAwayFlag[0].value == "true")
{
return "Warning Text";
}
}
Sửa: Tin xấu. Ở trên dường như không hoạt động trong IE6. Dường như nó kích hoạt các sự kiện theo thứ tự khác với Firefox, do đó onbeforeunload phát sinh trước AJAX beginRequest ... Có thể phải tìm cách thay đổi giá trị của cờ thông qua nhấp chuột siêu liên kết trước khi onbeforeunload kích hoạt.
Cảm ơn. Đọc spec và nó tham khảo "document.write" trong "To invoke". Điều đó chắc chắn xảy ra một bó với thư viện lưới chúng tôi đang sử dụng. – Paul