Подтвердить что ты не робот

Подавить Safaris "Вы ввели текст..." предупреждение?

Вы действительно хотите закрыть эту вкладку? Вы ввели текст в

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

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

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

4b9b3361

Ответ 1

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

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

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

Короче:

  • Скрыть ввод
  • Расположение триггеров
  • Показать ввод

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

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

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

Ответ 2

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

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

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

Ответ 3

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

window.onbeforeunload=function(e){}

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

$('txtarea').onkeyup=dirty;

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

function dirty(e){
 if (e.srcElement.value != e.srcElement.defaultValue){
  window.onbeforeunload=null;
 }
}

Ответ 4

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

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

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

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

EDIT По-видимому, установка window.onbeforeunload на пустую функцию все же работает, однако $(window).on('beforeunload', function() {}) не работает.