Chrome - Вы хотите сохранить этот пароль? получить неверное значение

У меня есть форма, которая позволяет пользователям запрашивать учетную запись на частном веб-сайте, но нет поля пользователя. Вместо этого спецификации для этого проекта требуют, чтобы пользователь вводил свой адрес электронной почты и пароль/подтверждал пароль. Также есть поля для ввода пользователем своего государства и страны.

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

Я понимаю, что Chrome будет перемещаться по полям формы до тех пор, пока не найдет поле с идентификатором id = password, после чего он пойдет по полю, чтобы найти id = имя пользователя. Поскольку у меня нет поля id = username и Chrome не относится к id = email, он, похоже, использует поле непосредственно перед полем id = password для имени пользователя.

Как заставить Chrome использовать поле с id = email для имени пользователя?

<form action="POST" src="#">
    <input id="email" type="text" />
    <input id="state" type="text" />
    <input id="country" type="text" />
    <input id="password" type="password" />
    <input id="confirmpassword" type="password" />

    <input type="submit" value="Request Account" />
</form>

При отправке вышеуказанная форма запускает запрос Chrome:

Would you like to save this password?

Iowa             ********

Обратите внимание, что "Iowa" - это любое значение, введенное в поле id = state, что, конечно, неверно.

В этот момент было бы сложно изменить id = email на id = username. Есть ли альтернативный способ сделать это и сохранить id = email?

Ответ 1

Кажется, существует только одно решение этой проблемы. Переименование id="email" до id="username" также не решает проблему. Кажется, что это не имеет значения для идентификатора или метки, браузеры используют поле непосредственно перед полем id="password" в качестве имени пользователя, поэтому я переместил два поля вместе, например:

<form action="POST" src="#">
    <input id="state" type="text" />
    <input id="country" type="text" />
    <input id="email" type="text" />
    <input id="password" type="password" />
    <input id="confirmpassword" type="password" />

    <input type="submit" value="Request Account" />
</form>

Если кто-нибудь знает, как я могу указать поле, используемое как username, в подсказке сохранения пароля браузера (независимо от позиционирования поля формы), я был бы признателен за указатель!

Ответ 2

У меня была та же проблема. Исправлено помещение скрытого поля (с дисплеем: нет) перед паролем и загрузка его с реальным значением поля входа:

<input type="text" name="user.loginId" id="new-loginId" tabindex="1" class="form-control" placeholder="Nome de usuário" value="${user.loginId}">
<input type="text" name="user.name" id="new-name" tabindex="2" class="form-control" placeholder="Nome completo" value="${user.name}">
<input type="text" id="browser-friendly-login-field-location" value="${user.loginId}" style="display:none"/>
<input type="password" name="user.password" id="new-password" tabindex="3" class="form-control" placeholder="Senha" oninput="checkPasswords(false);" onkeydown="checkPasswords(false);" onchange="checkPasswords(false);">
<input type="submit" onclick="$('#browser-friendly-login-field-location').val($('#new-loginId').val());"/>

Ответ 3

Решение Guilherme display: none не работало для меня, поэтому я применил следующий класс CSS в дополнительном поле входа:

.Login--hidden {
  height: 1px;
  position: absolute;  
  top: -1px;
  left: 0;
  width: 1px;
}

Мне также пришлось добавить элемент tabindex="-1" к элементу, чтобы вынуть его из потока табуляции.

Все еще не идеально.

Ответ 4

Я работаю над той же проблемой здесь. Сконфигурировано (прочитано где-то еще и протестировано), что только в chrome и в chrome вы можете установить autocomplete="username" в поле электронной почты. И это позволит браузеру узнать, какое поле имени пользователя является правильным. Однако это работает только для Chrome, поэтому я не использую это решение

Документация: