2010-07-10 21 views
18

Nếu người dùng làm mới trang được đề cập, nó sẽ thêm bản ghi khác vào cơ sở dữ liệu, vì vậy tôi muốn cảnh báo người dùng thông qua hộp cảnh báo nếu họ thực sự muốn làm mới trang và nếu họ nhấp vào ok thì trang sẽ được làm mới theo cách khác nếu họ bấm hủy bỏ nó sẽ không được.Làm cách nào để bật lên một hộp cảnh báo khi nút làm mới của trình duyệt được nhấp?

Cách đặt loại cảnh báo này xuất hiện khi nút làm mới của trình duyệt được nhấp theo cách tương thích với trình duyệt chéo?

Trả lời

33

Bạn có thể làm điều đó như thế này:

window.onbeforeunload = function() { 
    return "Data will be lost if you leave the page, are you sure?"; 
}; 

này sẽ hiển thị một dấu nhắc cho người sử dụng cho phép họ hủy. Nó không làm mới cụ thể, nhưng cho mục đích của bạn (như chỉnh sửa một câu hỏi trên SO) mà không có vẻ quan trọng, đó là mất thông tin không có vấn đề nơi bạn đang để lại.

+0

Một câu hỏi tuy nhiên, thông điệp của bạn "Dữ liệu sẽ bị mất nếu bạn rời khỏi trang, bạn có chắc ? " xuất hiện bên dưới thông báo khác trong hộp cảnh báo: "Bạn có chắc chắn muốn điều hướng khỏi trang này" và bên dưới xuất hiện thông báo "nhấn tiếp tục để điều hướng đi hoặc hủy để ở lại trang hiện tại". Có cách nào để tùy chỉnh 2 tin nhắn khác không? – Faber

+0

@Faber - Không phải là tôi biết ... đây là một điều trên mỗi trình duyệt sẽ thay đổi, sự kiện 'onbeforeunload' là * rất * không chuẩn. –

+0

Tôi cũng đang suy đoán ở đây, nhưng nó sẽ có thể phát hiện làm mới trang bằng cách kiểm tra xem url mà một trong những đi đến tiếp theo phù hợp với url của trang hiện tại, bằng cách nào đó với js? Bởi vì bây giờ nếu người dùng nhấp vào trang chủ hoặc một số trang khác sẽ không thêm mục nhập khác vào db, nó vẫn xuất hiện thông báo đó. – Faber

7

Không có một cách để buộc nó để chỉ những hành động làm mới, nhưng bạn có thể muốn xem xét window.onbeforeunload. Điều này sẽ cho phép bạn chạy một hàm trả về một chuỗi ngay trước khi trang được tải. Nếu chuỗi này không trống, thì hộp thoại xác nhận bật lên, chứa chuỗi này và một số văn bản soạn sẵn khác được cung cấp từ trình duyệt.

Ví dụ:

window.onbeforeunload = function() { 
    if (someConditionThatIndicatesIShouldConfirm) { 
     return "If you reload this page, your previous action will be repeated"; 
    } else { 
     return ""; 
    } 
} 

Cũng, nếu trang hiện tại đã được nạp thông qua một hoạt động POST, sau đó trình duyệt nên đã hiển thị một hộp thoại xác nhận khi người dùng cố gắng làm mới nó. Theo nguyên tắc chung, mọi hành động thay đổi trạng thái của dữ liệu trên máy chủ phải được thực hiện thông qua yêu cầu POST, thay vì một số GET.

+0

Hành vi này làm việc cho tôi - khi tôi rời ra trở lại "" - dường như trả lại bất kỳ chuỗi sẽ dẫn đến một dấu nhắc – stackdump

1

Điều này là không thể. Điều tốt nhất bạn có thể làm là sử dụng sự kiện onbeforeunload nhưng điều đó sẽ kích hoạt bất kỳ sự kiện nào thoát khỏi trang hiện tại. Không thể nhắm mục tiêu nút làm mới cụ thể.

Xem ví dụ: this question trên onbeforeunload

Nó có thể là tốt hơn mặc dù để xây dựng một tấm séc trùng lặp vào cơ sở dữ liệu của bạn. Điều đó sẽ bắt được việc gửi ngẫu nhiên bằng cách sử dụng nút "quay lại".

Một giải pháp thay thế sẽ sử dụng mã thông báo một lần ngẫu nhiên được tích hợp vào biểu mẫu. Nếu hai hoạt động được cố gắng sử dụng cùng một mã thông báo, bạn sẽ dừng nó.

2

Có hai cách có thể chuyển tiếp với điều này, cả hai đều hoàn toàn khác nhau.

Một cách để có trình xử lý sự kiện được liên kết với sự kiện onbeforeunload để bạn có thể phát hiện khi người dùng là duyệt qua từ trang hiện tại. Tuy nhiên, nếu bộ nhớ của tôi phục vụ cho tôi một cách chính xác, onbeforeunload không nhất quán trên các trình duyệt (tôi không nghĩ Opera trả lời nó IIRC, nhưng không có cách nào để kiểm tra hiện tại). Tất nhiên, giải pháp này không thành công nếu người dùng tắt JavaScript.

Cách thứ hai và mạnh mẽ hơn là triển khai Post Redirect Get pattern khi được sử dụng, ngăn không cho dữ liệu được đăng lại khi người dùng làm mới trang.

+0

+ 1 cho Chuyển hướng bài đăng Nhận – Robert

0

bạn có thể sử dụng jquery cho điều này ... cho điều này, bạn phải đính kèm tập tin js của jquery.

<script> 
var count=0; 
$(document).ready(function(){ 
    alert("hi" + (count++)); 
    confirm("sure?") 
}); 
</script> 
+1

anh ấy hỏi về nút làm mới – ppaulojr

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