У меня есть несколько страниц с формами в моем приложении.
Как я могу защитить форму таким образом, чтобы, если кто-то уходит или закрывает вкладку браузера, ему было предложено подтвердить, что он действительно хочет оставить форму с несохраненными данными?
javascript
forms
хан
источник
источник
Ответы:
Короткий, неправильный ответ:
Вы можете сделать это, обработав
beforeunload
событие и вернув ненулевую строку :Проблема этого подхода заключается в том, что отправка формы также запускает событие unload . Это легко исправить, добавив флаг, которым вы отправляете форму:
Затем вызывая сеттер при отправке:
Но читайте дальше ...
Длинный правильный ответ:
Вы также не хотите показывать это сообщение, когда пользователь ничего не изменил в ваших формах . Одним из решений является использование
beforeunload
события в сочетании с «грязным» флагом, который вызывает запрос только в том случае, если он действительно актуален.Сейчас для реализации
isDirty
метода существуют различные подходы.Вы можете использовать jQuery и сериализацию форм , но у этого подхода есть некоторые недостатки. Сначала вам нужно изменить код, чтобы он работал в любой форме (
$("form").each()
будет работать), но самая большая проблема заключается в том, что jQueryserialize()
будет работать только с именованными, не отключенными элементами, поэтому изменение любого отключенного или безымянного элемента не вызовет грязный флаг. Для этого есть обходные пути , такие как создание элементов управления только для чтения вместо включения, сериализации и повторного отключения элементов управления.Таким образом, события, кажется, путь. Вы можете попробовать прослушивать нажатия клавиш . Это событие имеет несколько проблем:
change
Событие также не вызывает на значениях , установленных в коде JavaScript , так и не будет работать для виртуальных входов.Привязка
input
события ко всемinput
s (иtextarea
s иselect
s) на вашей странице не будет работать в старых браузерах и, как и все упомянутые выше решения по обработке событий, не поддерживает отмену. Когда пользователь изменяет текстовое поле, а затем отменяет его, или устанавливает и снимает флажок, форма все еще считается грязной.А когда вы захотите реализовать больше поведения, например игнорировать определенные элементы, у вас будет еще больше работы.
Не изобретай велосипед
Поэтому, прежде чем задуматься о реализации этих решений и всех необходимых обходных путей, поймите, что вы заново изобретаете колесо и вы склонны сталкиваться с проблемами, которые другие для вас уже решили.
Если ваше приложение уже использует jQuery, вы также можете использовать проверенный, поддерживаемый код вместо собственного и использовать библиотеку третьей стороны для всего этого. JQuery вы уверены? Плагин прекрасно работает, смотрите их демонстрационную страницу . Это так просто, как это:
Пользовательские сообщения не поддерживаются везде
Обратите внимание, что Firefox 4 не поддерживает пользовательские сообщения в этом диалоговом окне. По состоянию на апрель 2016 года развернут Chrome 51, в котором также удаляются пользовательские сообщения .
На этом сайте есть другие альтернативы, но я думаю, что такой диалог достаточно ясен:
источник
Проверьте событие JavaScript onbeforeunload . Это нестандартный JavaScript, представленный Microsoft, однако он работает в большинстве браузеров, и их документация onbeforeunload содержит больше информации и примеров.
источник
через JQuery
Вы можете использовать функцию Google JQuery Form Serialize, которая соберет все входные данные формы и сохранит их в массиве. Я думаю, этого объяснения достаточно :)
источник
Универсальное решение, не требующее настройки, которое автоматически обнаруживает все входные изменения, включая contenteditable элементы:
источник
Построенный на основе отличной идеи Васима А. использовать сериализацию. Проблема заключалась в том, что предупреждение также отображалось при отправке формы. Это было исправлено здесь.
Он был протестирован в Chrome и IE 11.
источник
Основываясь на предыдущих ответах и собранных вместе из разных мест переполнения стека, вот решение, которое я придумал, которое обрабатывает случай, когда вы действительно хотите отправить свои изменения:
Стоит отметить, что IE11, похоже, требует, чтобы
closeEditorWarning
функция возвращалась,undefined
чтобы не показывать предупреждение.источник
QC.thisPage.isDirty = false;
бытьwindow.thisPage.isDirty = false;
? Таким образом, он проверит, отправляете ли вы форму, и не отобразит предупреждение. Казалось, работает для моих тестов. Кроме того, большинство форм имеют,input
а неtextarea
. Я использовал следующее, что работает довольно хорошо:$("form").on('keyup', 'textarea,input,select', function () {
Следующая однострочная работа сработала для меня.
Просто установите
modified
в истинно или ложно в зависимости от состояния приложения.источник
undefined
а неnull
как IE, выведет 'null', еслиmodified
установлено значение false.Следующий код прекрасно работает. Вам нужно достичь изменений ввода элементов формы через атрибут id:
источник
источник
Вы можете использовать serialize () для создания текстовой строки в кодировке URL-адреса путем сериализации значений формы и проверки, изменилась ли форма перед загрузкой.
Перейдите по этой ссылке https://coderwall.com/p/gny70a/alert-when-leaving-page-with-unsaved-form Автор сценария Владимир Сидоренко
источник
serialize()
, и, действительно, у этого есть свои недостатки.В добавление к идее @codecaster вы можете добавить это на каждую страницу с формой (в моем случае я использую ее глобально, так что только в формах будет это предупреждение) измените его функцию на
Также добавьте формы отправки, включая логин и ссылки для отмены, чтобы при нажатии кнопки «Отмена» или «Отправить» форма не вызывала предупреждение также на каждой странице, где есть форма ...
источник
Вы можете проверить подробное объяснение здесь: http://techinvestigations.redexp.in/comparison-of-form-values-on-load-and-before-close/ сравнение значений формы при загрузке и -перед-близко
Основной код:
источник
Короткий ответ:
источник
Решение от Eerik Sven Puudist ...
... спонтанно выполнил эту работу для меня в сложной объектно-ориентированной обстановке без каких-либо изменений.
Единственное изменение, которое я применил, состояло в том, чтобы ссылаться на конкретную форму (только одну форму на файл), называемую «formForm» («form» -> «#formForm»):
Особенно хорошо сделано то, что кнопка отправки «оставлена в покое».
Кроме того, он работает и для меня с последней версией Firefox (по состоянию на 7 февраля 2019 года).
источник
Протестировал универсальное решение Eli Grey, сработало только после того, как я упростил код до
Модификации его удаляются использованием
target[defaultValue]
и только использованиемtarget.dataset[defaultValue]
для хранения реального значения по умолчанию.И я добавил «сохраненный» прослушиватель событий, где «сохраненное» событие будет вызвано вами самостоятельно при успешном сохранении.
Но это «универсальное» решение работает только в браузерах, но не работает в веб-обозрении приложения, например, wechat-браузерах.
Чтобы заставить его работать в браузерах wechat (частично), еще одно улучшение:
источник
Я сделал это по-другому, поделившись здесь, чтобы кто-то мог получить помощь, протестирован только с Chrome.
Я хотел предупредить пользователя перед закрытием вкладки, только если есть какие-то изменения.
Работает хорошо, но есть другая проблема: когда я отправляю форму, я получаю нежелательное предупреждение, я вижу много обходных путей, это происходит потому, что onbeforeunload срабатывает перед отправкой, поэтому мы не можем обработать его в событии onsubmit, как
onbeforeunload = null
, но Событие onclick кнопки отправки срабатывает перед обоими этими событиями, поэтому я обновил кодисточник
Прежде всего, большинство браузеров имеет эту функцию по умолчанию. А зачем тебе это вообще? Почему бы не сохранить форму синхронизированной? Я имею в виду, сохранить его на любое изменение, не дожидаясь отправки от пользователя. Как это делают контакты Google. Конечно, если только все поля в форме являются обязательными. Пользователям не нравится, когда они заставляют что-то заполнять без возможности уйти, чтобы подумать, нужно ли им это. :)
источник
save it on any change without waiting any submitting from user
Вы не всегда хотите это делать. Иногда пользователь хочет внести много изменений, а затем просмотреть и подтвердить, что он хочет сохранить его.