2010-07-10 6 views
18

Если пользователь обновит страницу, о которой идет речь, она добавит еще одну запись в базу данных, поэтому я хочу предупредить пользователя через окно предупреждения, если они действительно хотят обновить страницу, и если они нажмут ok, тогда страница должна быть обновлена ​​иначе если они нажмут отменить, этого не будет.Как открыть окно предупреждения при нажатии кнопки обновления браузера?

Как сделать этот вид окна предупреждения появляться, когда кнопка обновления браузера нажата таким образом, чтобы обеспечить совместимость с браузером?

ответ

33

Вы можете сделать это следующим образом:

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

Это покажет приглашение пользователю, позволяя им отменить. Это не обновление, но для ваших целей (например, редактирование вопроса о SO), которое, похоже, не имеет значения, это потеря информации независимо от того, куда вы уходите.

+0

Один вопрос, хотя, ваше сообщение «Данные будут потеряны, если вы закроете страницу, вы уверены, ?» появляется под другим сообщением в окне предупреждения: «Вы уверены, что хотите перейти от этой страницы», а внизу появляется сообщение «нажмите продолжить, чтобы перейти или отменить, чтобы оставаться на текущей странице». Есть ли способ настроить эти 2 других сообщения? – Faber

+0

@Faber - Не то, чтобы я знал ... это вещь для браузера, которая будет меняться, событие 'onbeforeunload' * очень * нестандартное. –

+0

также я просто размышляю здесь, но можно ли обнаруживать обновление страницы, проверяя, соответствует ли URL-адрес тому, что один идет, соответствует URL-адресу текущей страницы, как-то с js? Потому что теперь, если пользователь нажимает на главную страницу или какую-то другую страницу, которая не добавит другую запись в db, она по-прежнему выводит это сообщение. – Faber

7

Нет способа привязать его только к действию обновления, но вы можете посмотреть в window.onbeforeunload. Это позволит вам запустить функцию, которая возвращает строку непосредственно перед выгрузкой страницы. Если эта строка не пуста, появится диалоговое окно подтверждения всплывающих окон, содержащее эту строку и другой текст шаблона, предоставленный в браузере.

Например:

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

Также, если текущая страница была загружена с помощью POST операции, то браузер должен уже отобразить окно подтверждения, когда пользователь пытается обновить его. Как правило, любое действие, которое изменяет состояние данных на сервере, должно выполняться с помощью запроса POST, а не GET.

+0

Такое поведение работает для меня - когда я ушел из возвращения «» - кажется возвращение любая строка приведет к быстрой – stackdump

1

Это невозможно. Лучшее, что вы можете сделать, это использовать событие onbeforeunload, но оно запустит любое событие, покидающее текущую страницу. Невозможно настроить таргетинг на кнопку обновления.

См., Например, this question on onbeforeunload

Возможно, было бы лучше создать двойную проверку в вашей базе данных. Это приведет к случайным представлениям с помощью кнопки «назад».

Альтернативой будет использование случайного одноразового токена, который будет встроен в форму. Если две операции будут предприняты с использованием одного и того же токена, вы остановите его.

2

Есть два возможных пути с этим, оба совершенно разные.

Одним из способов было бы связать событие с событием onbeforeunload, чтобы вы могли обнаружить, когда пользователь просматривает с текущей страницы. Если моя память служит мне правильно, то onbeforeunload несовместим в разных браузерах (я не думаю, что Opera ответит на него IIRC, но не имеет возможности протестировать). Конечно, это решение выходит из строя, если пользователь отключает JavaScript.

Второй и более надежный способ заключается в реализации Post Redirect Get pattern, который при использовании предотвращает повторную отправку данных, когда пользователь обновляет страницу.

+0

+ 1 для Post Redirect Получить – Robert

0

вы можете использовать jquery для этого ... Для этого вам нужно прикрепить js-файл jquery.

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

он спросил о кнопке обновления – ppaulojr

Смежные вопросы