Подавить предупреждение Safari «Вы ввели текст…»? - PullRequest
12 голосов
/ 25 марта 2011

Are you sure you want to close this tab? You have entered text on “Stack Overflow”. If you close the tab, your changes will be lost. Do you want to close the tab anyway?

Safari подсказывает (?) Перед закрытием вкладки или окна, когда текст вводится во ввод.

В некоторых случаях, как веб-разработчик,это нежелательно - например, когда ввод является активным поиском, когда пользователь , вероятно, уже получил результаты, которые он ищет , когда окно закрыто, даже если в поле еще есть текст.

Как я могу сообщить Safari, что текст в конкретном входе не нуждается в защите?

Ответы [ 4 ]

6 голосов
/ 25 марта 2011

Похоже, что вы можете отключить это предупреждение для всей страницы, установив обработчик onbeforeunload на <body> (подойдет даже пустой).Например, следующее не выдаст предупреждение:

<body onbeforeunload="">
    <form method="get"><input></form>
</body>

Я не уверен, является ли это предполагаемым поведением или ошибкой.

3 голосов
/ 26 марта 2011

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

$('.unimportant').live('blur', function(){
    var olddisplay = this.style.display;
    this.style.display = 'none';
    this.clientLeft; // layout
    this.style.display = olddisplay;
});

Демо (попробуйте ввести в поле «неважно», нажмите где-нибудь еще на странице, затем закройте окно).

Короче говоря:

  1. Скрыть вход
  2. Схема триггера
  3. Показать вход

Вы также можете изменить значение ввода, расположение триггера и вернуть его обратно.

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

Я открыт для более чистых решений.

2 голосов
/ 28 июля 2011

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

window.onbeforeunload=function(e){}

Но после отправки я могу внести дополнительные изменения, поэтому я хочу, чтобы предупреждение появилось снова. Для этого я добавил обработчик keyup к элементу формы.

$('txtarea').onkeyup=dirty;

Что делает грязный, так это проверяет, изменилось ли поле ввода, если оно изменилось, тогда я установил для onbeforeunload значение null.

function dirty(e){
 if (e.srcElement.value != e.srcElement.defaultValue){
  window.onbeforeunload=null;
 }
}
0 голосов
/ 14 августа 2014

Я только что нашел другое решение, чтобы Safari не отображал «Вы уверены, что хотите перезагрузить эту страницу?» , когда текстовые области изменили свое содержимое.

Оказывается,установка значения с помощью Javascript очищает состояние Safari changed:

$(document).on('blur', 'textarea', function() {
    var value = $(this).val();
    $(this).val('').val(value);
});

Важно сначала очистить значение, напрямую установить его для содержимого, которое уже есть, не работает.

РЕДАКТИРОВАТЬ Очевидно, установка window.onbeforeunload на пустую функцию все еще работает, однако $(window).on('beforeunload', function() {}) - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...