Эй, я работаю над веб-приложением, в котором есть диалог входа в систему, который работает следующим образом:
- Пользователь нажимает «Войти»
- Форма входа HTML загружается с AJAX и отображается в DIV на странице
- Пользователь вводит пользователя / передает в поля и нажимает кнопку отправить. Это НЕ
<form>
- пользователь / пароль передаются через AJAX - Если пользователь / пароль в порядке, страница перезагружается, когда пользователь вошел в систему.
- Если user / pass не верны, страница НЕ перезагружается, но в DIV появляется сообщение об ошибке, и пользователь пытается повторить попытку.
Вот в чем проблема: браузер никогда не предлагает обычную подсказку «Сохранить этот пароль? Да / Никогда / Не сейчас», которую он делает для других сайтов.
Я попытался обертывание <div>
в <form>
тегах с «автозаполнения =" на» , но это не имеет никакого значения.
Можно ли заставить браузер предлагать хранить пароль без серьезной переделки моего входа в систему?
спасибо Эрик
PS, чтобы добавить к моему вопросу, я определенно работаю с браузерами, которые хранят пароли, и я никогда не нажимал «никогда для этого сайта» ... это техническая проблема с браузером, не обнаружившим, что это форма входа, не ошибка оператора :-)
Ответы:
Я нашел полное решение для этого вопроса. (Я проверял это в Chrome 27 и Firefox 21).
Есть две вещи, которые нужно знать:
1. Нажмите «Сохранить пароль»:
Для Firefox 21 «Сохранить пароль» запускается, когда он обнаруживает, что существует форма, содержащая поле ввода текста и поле ввода пароля. Так что нам просто нужно использовать
someFunctionForLogin()
выполняет вход в ajax и перезагружает / перенаправляет на страницу входа, в то время какevent.preventDefault()
блокирует первоначальное перенаправление из-за отправки формы.Если вы имеете дело только с Firefox, вышеуказанного решения достаточно, но оно не работает в Chrome 27. Затем вы спросите, как вызвать «Сохранить пароль» в Chrome 27.
Для Chrome 27 «Сохранить пароль» запускается после его перенаправления на страницу путем отправки формы, содержащей текстовое поле ввода с атрибутом name = 'username' и поля ввода пароля с атрибутом name = 'password' . Поэтому мы не можем заблокировать перенаправление из-за отправки формы, но мы можем сделать перенаправление после того, как мы выполнили вход в AJAX. (Если вы хотите, чтобы вход в ajax не перезагружал страницу или не перенаправлял ее на страницу, к сожалению, мое решение не работает.) Тогда мы можем использовать
Кнопка с type = 'button' сделает форму не подлежащей отправке при нажатии кнопки. Затем, связывание функции с кнопкой для входа в AJAX. Наконец, вызов
$('#loginForm').submit();
перенаправляет на страницу входа. Если страница входа в систему является текущей страницей, то вы можете заменить «SignIn.xxx» текущей страницей, чтобы выполнить «обновление».Теперь вы обнаружите, что метод для Chrome 27 также работает в Firefox 21. Так что лучше его использовать.
2. Восстановите сохраненное имя пользователя / пароль:
Если у вас уже есть loginForm, жестко запрограммированный как HTML, у вас не возникнет проблем с восстановлением сохраненного пароля в loginForm.
Однако сохраненное имя пользователя / пароль не будет привязано к loginForm, если вы используете js / jquery для динамического создания loginForm, потому что сохраненное имя пользователя / пароль привязывается только при загрузке документа.
Поэтому вам нужно было жестко закодировать loginForm как HTML и использовать js / jquery для динамического перемещения / показа / скрытия loginForm.
Примечание: если вы входите в Ajax, не добавляйте
autocomplete='off'
в форму тега, какautocomplete='off'
восстановление имени пользователя / пароля в loginForm завершится неудачно, потому что вы не разрешаете ему «автозаполнение» имени пользователя / пароля.источник
ENTER
ключ для отправки формы, так как у вас есть,prevented default
когда пользователь отправил форму, ничего не произойдет, это плохой UX. Вы можете проверить ключ вводаkeycode
при отправке, однако вы снова попадете на попрошайничество ...Используя кнопку для входа в систему:
Если вы используете для входа
type="button"
с помощьюonclick
обработчикajax
, то браузер не предложит сохранить пароль.Поскольку эта форма не имеет кнопки отправки и не имеет поля действия, браузер не предложит сохранить пароль.
Используя кнопку отправки для входа в систему:
Однако если вы измените кнопку
type="submit"
и обработаете отправку, браузер предложит сохранить пароль.Используя этот метод, браузер должен предложить сохранить пароль.
Вот Javascript, используемый в обоих методах:
источник
Я боролся с этим сам, и я наконец смог отследить проблему и то, что заставляло это терпеть неудачу.
Все это проистекает из того факта, что моя форма входа была динамически введена на страницу (с помощью backbone.js). Как только я вставил свою форму входа в систему непосредственно в файл index.html, все заработало как чудо.
Я думаю, это потому, что браузер должен знать, что существует существующая форма входа в систему, но так как мой динамически вводился на страницу, он не знал, что когда-либо существовала «настоящая» форма входа.
источник
Это решение работало для меня, размещенного Эриком на codingforums
Код:
Посмотрите, не вызывает ли это приглашение.
Эрик
Опубликовано на http://www.codingforums.com/showthread.php?t=123007
источник
action
на какую-нибудь фиктивную страницу.iframe
обходных путей больше не требуется. См stackoverflow.com/a/33113374/810109Существует окончательное решение, чтобы заставить все браузеры (протестированные: Chrome 25, Safari 5.1, IE10, Firefox 16) запрашивать сохранение пароля с помощью jQuery и ajax request:
JS:
HTML:
Хитрость заключается в том, чтобы остановить форму, чтобы отправить ее собственным способом (event.stopPropagation ()), вместо этого отправьте свой собственный код ($ .ajax ()) и при успешном обратном вызове ajax отправьте форму снова, чтобы браузер перехватил ее и отобразил запрос на сохранение пароля. Вы также можете добавить обработчик ошибок и т. Д.
Надеюсь, это помогло кому-то.
источник
login.php?username=username&password=password
запрос к цели, которая в первую очередь сводит на нет всю цель сохранения пароляevent listener
в форму и добавитьevent.preventDefault()
плюсevent.stopPropagation()
Я попробовал ответ спецона, но это не сработало для меня в Chrome 18. Что сработало, так это добавление обработчика загрузки в iframe и не прерывание отправки (jQuery 1.7):
HTML:
getSessions () выполняет AJAX-вызов и показывает div loginForm в случае сбоя. (Веб-сервис вернет 403, если пользователь не аутентифицирован).
Проверено на работу в FF и IE8.
источник
/login
в вашем примере) не вернет какой-либо текст или другое видимое содержимое.iframe
обходных путей больше не требуется. См stackoverflow.com/a/33113374/810109Браузер может не обнаружить, что ваша форма является формой входа. Согласно некоторым обсуждениям в этом предыдущем вопросе , браузер ищет поля формы, которые выглядят следующим образом
<input type="password">
. Ваше поле формы пароля реализовано подобно этому?Редактировать: чтобы ответить на ваши вопросы ниже, я думаю, что Firefox обнаруживает пароли
form.elements[n].type == "password"
(итерируя по всем элементам формы), а затем обнаруживает поле имени пользователя путем поиска в обратном направлении по элементам формы для текстового поля непосредственно перед полем пароля (более подробная информация здесь ). Из того, что я могу сказать, ваша форма входа должна быть частью<form>
или Firefox не обнаружит ее.источник
Простой подход 2020
Это автоматически включит автозаполнение и сохранит пароль в браузерах.
autocomplete="on"
(Форма)autocomplete="username"
(ввод, электронная почта / имя пользователя)autocomplete="current-password"
(введите пароль)Узнайте больше в документации Apple: Включение автозаполнения пароля в элементе ввода HTML
источник
preventDefault
), и это не будет работать, если есть только одно поле пароля (приложения типа цифрового сейфа). Поделиться этими результатами для тех, кто может найти это полезным.Я потратил много времени на чтение различных ответов в этой теме, и для меня это было что-то немного другое (связанное, но другое). В Mobile Safari (устройства iOS), если форма входа скрыта при загрузке страницы, приглашение не появится (после того, как вы покажете форму, отправьте ее). Вы можете проверить с помощью следующего кода, который отображает форму через 5 секунд после загрузки страницы. Снимите JS и дисплей: нет, и все работает. Мне еще предстоит найти решение этой проблемы, я просто разместил сообщение на тот случай, если кто-то еще столкнется с такой же проблемой и не сможет выяснить причину.
JS:
HTML:
источник
Ни один из ответов уже не дает понять, что вы можете использовать API истории HTML5, чтобы запросить сохранение пароля.
Во-первых, вы должны убедиться, что у вас есть хотя бы
<form>
элемент с паролем и адресом электронной почты или именем пользователя. Большинство браузеров обрабатывают это автоматически, если вы используете правильные типы ввода (пароль, адрес электронной почты или имя пользователя). Но чтобы быть уверенным, установите значения автозаполнения правильно для каждого элемента ввода.Вы можете найти список значений автозаполнения здесь: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete
Те , которые вам нужны:
username
,email
иcurrent-password
Тогда у вас есть две возможности:
Вы также можете изменить URL страницы, но это не обязательно, чтобы запросить сохранение пароля:
Документация: https://developer.mozilla.org/en-US/docs/Web/API/History/pushState
Это дает дополнительное преимущество: вы можете запретить браузеру запрашивать сохранение пароля, если пользователь ввел пароль неверно. Обратите внимание, что в некоторых браузерах браузер всегда запрашивает сохранение учетных данных, даже когда вы вызываете .preventDefault и не используете API истории.
Если вы не хотите уходить и / или изменять историю браузера, вы можете вместо этого использовать replaceState (это также работает).
источник
history.pushState({}, null "Your new page title");
чтобы изменить URL без какой-либо навигацииСледующий код проверен на
JS-Fiddle:
http://jsfiddle.net/ocozggqu/
Пост-код:
замечания
window.external.AutoCompleteSaveForm
необходимоВот пример ajax-логина:
замечания
источник
Я нашел довольно элегантное решение (или взломать, что угодно) для пользователей Prototype.JS, будучи одним из последних, кто отказался от использования Prototype. Простая замена соответствующих методов jQuery должна сделать свое дело.
Во-первых, убедитесь, что есть
<form>
тег и кнопка отправки с именем класса, на которое можно ссылаться позже (в данном случаеfaux-submit
), который вложен в элемент с установленным стилемdisplay:none
, как показано ниже:Затем создайте наблюдатель клика для того
button
, который будет «отправлять» форму, как показано:Затем создайте прослушиватель для
submit
события и остановите его.event.stop()
остановит все события отправки в DOM, если он не заключен вEvent.findElement
класс скрытой кнопки ввода (как указано вышеfaux-submit
):Это проверено как работающее в Firefox 43 и Chrome 50.
источник
Ваш сайт, вероятно, уже находится в списке, в котором браузеру запрещается сохранять пароль. В Firefox Настройки -> Безопасность -> Запомнить пароль для сайтов [флажок] - исключения [кнопка]
источник
Добавьте немного больше информации к ответу @Michal Roharik.
если ваш вызов ajax вернет URL-адрес возврата, вы должны использовать jquery для изменения атрибута действия формы на этот URL-адрес перед вызовом form.submit
ех.
источник
У меня была похожая проблема, вход в систему осуществлялся с помощью ajax, но браузеры (firefox, chrome, safari и IE 7-10) не предлагали сохранять пароль, если форма (#loginForm) отправляется с помощью ajax.
В качестве РЕШЕНИЯ я добавил скрытый вход для отправки (#loginFormHiddenSubmit) в форму, которая была отправлена ajax, и после того, как вызов ajax вернет успех, я бы вызвал щелчок для скрытого ввода. Страница любым способом должна была обновиться. Клик может быть вызван с:
Причина, по которой я добавил скрытую кнопку отправки, заключается в следующем:
не предлагал бы сохранять пароль в IE (хотя это работало в других браузерах).
источник
Не каждый браузер (например, IE 6) имеет опции для запоминания учетных данных.
Одна вещь, которую вы можете сделать, - это (после успешного входа пользователя) сохранить информацию о пользователе с помощью cookie и иметь опцию «Запомнить меня на этом компьютере». Таким образом, когда пользователь снова приходит (даже если он вышел из системы), ваше веб-приложение может извлечь файл cookie и получить информацию о пользователе (идентификатор пользователя + идентификатор сеанса) и позволить ему продолжить работу.
Надеюсь, это может быть наводящим на размышления. :-)
источник
useful garbage
для идентификации пользователя. Даже ТАК хранит информацию в куки, чтобы узнать вас.По правде говоря, вы не можете заставить браузер спрашивать. Я уверен, что в браузере есть собственный алгоритм для предположения, если вы ввели имя пользователя / пароль, например, для поиска ввода,
type="password"
но вы не можете установить что-либо для принудительной работы браузера.Как и другие пользователи, вы можете добавить информацию о пользователе в файл cookie. Если вы сделаете это, вам лучше как минимум зашифровать его и не хранить свой пароль. Возможно сохранить их имя пользователя максимум.
источник
Вы можете прикрепить диалог к форме, чтобы все эти входные данные были в форме. Другое дело, сделать текстовое поле пароля сразу после текстового поля имени пользователя.
источник
Это работает намного лучше для меня, потому что это 100% ajaxed и браузер обнаруживает логин.
источник
Использование cookie, вероятно, будет лучшим способом сделать это.
Вы могли бы иметь флажок «Запомнить меня?» и иметь форму создания куки для хранения // логина пользователя // информация. РЕДАКТИРОВАТЬ: Информация о сеансе пользователя
Чтобы создать cookie, вам нужно обработать форму входа с помощью PHP.
источник