Можно ли потребовать два поля формы для соответствия HTML5?


98

Есть ли способ потребовать, чтобы записи в двух полях формы совпадали с использованием HTML5? Или это все еще нужно делать с помощью javascript? Например, если у вас есть два поля пароля и вы хотите убедиться, что пользователь ввел одни и те же данные в каждое поле, есть ли какие-то атрибуты или другой код, который можно сделать для этого?


Что ж, это хороший момент. Однако я также хотел бы иметь возможность реализовать способ HTML5, если он существует.
user981178 04

Проблема, с которой я столкнулся с сопоставлением шаблонов регулярных выражений в HTML5, заключается в том, что сопоставляется любой специальный символ: пароль: Cat $ Подтверждение пароля: Cat @ выдаст совпадение в поле подтверждения. Хотя у меня есть сценарий проверки, который не разрешает отправку, он предоставляет ложный индикатор пользователю.
трекка примерно

Ответы:


87

Не совсем с проверкой HTML5, но небольшой JavaScript может решить проблему, следуйте примеру ниже:

<p>Password:</p>
<input name="password" required="required" type="password" id="password" />
<p>Confirm Password:</p>
<input name="password_confirm" required="required" type="password" id="password_confirm" oninput="check(this)" />
<script language='javascript' type='text/javascript'>
    function check(input) {
        if (input.value != document.getElementById('password').value) {
            input.setCustomValidity('Password Must be Matching.');
        } else {
            // input is valid -- reset the error message
            input.setCustomValidity('');
        }
    }
</script>
<br /><br />
<input type="submit" />

1
возникнет ли проблема с этим кодом, если мы: 1. введем оба пароля одинаково, а затем 2. вернемся к первому полю пароля и изменим его значение?
Mladen B.

Да, и если вы, например, введете «abc» в первое поле и «bcd» во втором поле, а затем измените «abc» в первом поле на «bcd», пароли совпадают, но вы все равно получите неверное входное сообщение.
Роэл Купс

Проблемы, упомянутые в приведенных выше комментариях, могут быть решены путем: 1) добавления oninput="check(this)"в первое поле пароля и 2) изменения input.valueфункции на document.getElementById('password_confirm').value. Так оно и сталоif (document.getElementById('password_confirm').value != document.getElementById('password').value)
Кодос Джонсон

32

Вы можете использовать шаблоны ввода с регулярными выражениями (проверьте совместимость с браузером )

<input id="password" name="password" type="password" pattern="^\S{6,}$" onchange="this.setCustomValidity(this.validity.patternMismatch ? 'Must have at least 6 characters' : ''); if(this.checkValidity()) form.password_two.pattern = this.value;" placeholder="Password" required>

<input id="password_two" name="password_two" type="password" pattern="^\S{6,}$" onchange="this.setCustomValidity(this.validity.patternMismatch ? 'Please enter the same Password as above' : '');" placeholder="Verify Password" required>

46
Хотя это работает, это все еще плохой ответ по двум причинам: вы утверждаете, что это решение только для html, а это не так, и вы не объясняете, как оно работает.
wvdz

8
Наверное, это правда. Тем не менее, хотя это плохой ответ, это отличное решение. Когда значение вводится в первое поле, выполняется проверка шаблона пароля, определенная для этого ввода. Если это не соответствует вашему шаблону pw, отображается сообщение. Если он соответствует вашему требуемому шаблону, он меняет требуемый шаблон для второго поля pw, чтобы оно было значением, введенным пользователем. Если пользователь вводит что-то во втором поле, это должно быть значение из первого поля, иначе отображается сообщение об ошибке. Довольно мило. Я задумываюсь, не создает ли это проблем с безопасностью. Я не думаю, что это так ...
Брайан Лейман

5
Уловка здесь в том, что "form.password_two.pattern = this.value" прерывается специальными символами, имеющими особое значение в
регулярных выражениях

1
@wvdz никогда не говорил, что это чистый HTML, но для ясности добавил ссылку на совместимость с браузером
Франсиско Коста,

1
Я считаю, что patternатрибут для password_twoполя нужно опустить . Как и в настоящее время, если вы введете в password_twoполе пароль, который короче 6 символов , оставив passwordпустым - будет отображаться Please enter the same Password as aboveсообщение проверки. Что может сбить с толку: то же самое произойдет, если вы введете в оба поля один и тот же пароль, который короче 6 символов.

13

Простое решение с минимальным количеством javascript - использовать шаблон атрибута html (поддерживается большинством современных браузеров). Это работает, устанавливая образец второго поля на значение первого поля.

К сожалению, вам также нужно избегать регулярного выражения, для которого не существует стандартной функции.

<form>
    <input type="text" oninput="form.confirm.pattern = escapeRegExp(this.value)">
    <input name="confirm" pattern="" title="Fields must match" required>
</form>
<script>
    function escapeRegExp(str) {
      return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
    }
</script>

Спасибо за это; Мне удалось поместить функцию непосредственно в обработчик, но мне пришлось указать идентификатор в подтверждении: <input type="password" name="password" oninput="document.getElementById('confirm').pattern = this.value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&')" required><input type="password" id="confirm" name="confirm" pattern="" title="Fields must match" required>не читается, как ваш, но позволяет избежать отдельного скрипта / функции.
Дэвид Браун

4

Потребуется JavaScript, но объем кода можно свести к минимуму, используя промежуточный <output>элемент и oninputобработчик формы для выполнения сравнения (шаблоны и проверка могут дополнить это решение, но здесь не показаны для простоты):

<form oninput="result.value=!!p2.value&&(p1.value==p2.value)?'Match!':'Nope!'">
  <input type="password" name="p1" value="" required />
  <input type="password" name="p2" value="" required />
  <output name="result"></output>
</form>

2

Не только HTML5, но и немного JavaScript.
Нажмите [здесь] https://codepen.io/diegoleme/pen/surIK

HTML

    <form class="pure-form">
    <fieldset>
        <legend>Confirm password with HTML5</legend>

        <input type="password" placeholder="Password" id="password" required>
        <input type="password" placeholder="Confirm Password" id="confirm_password" required>

        <button type="submit" class="pure-button pure-button-primary">Confirm</button>
    </fieldset>
</form>

JAVASCRIPT

var password = document.getElementById("password")
  , confirm_password = document.getElementById("confirm_password");

function validatePassword(){
  if(password.value != confirm_password.value) {
    confirm_password.setCustomValidity("Passwords Don't Match");
  } else {
    confirm_password.setCustomValidity('');
  }
}

password.onchange = validatePassword;
confirm_password.onkeyup = validatePassword;

0

Ответы, использующие шаблон и регулярное выражение, записывают пароль пользователя во входные свойства в виде обычного текста pattern='mypassword'. Это будет видно только в том случае, если инструменты разработчика открыты, но это все еще не кажется хорошей идеей.

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

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

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

Для реальной страницы вы должны изменить типы ввода на «пароль».

<form>
    <input type="text" id="password1" oninput="setPasswordConfirmValidity();">
    <input type="text" id="password2" oninput="setPasswordConfirmValidity();">
</form>
<script>
    function setPasswordConfirmValidity(str) {
        const password1 = document.getElementById('password1');
        const password2 = document.getElementById('password2');

        if (password1.value === password2.value) {
             password2.setCustomValidity('');
        } else {
            password2.setCustomValidity('Passwords must match');
        }
        console.log('password2 customError ', document.getElementById('password2').validity.customError);
        console.log('password2 validationMessage ', document.getElementById('password2').validationMessage);
    }
</script>

0

Как уже упоминалось в других ответах, для этого нет чистого HTML5.

Если вы уже используете JQuery , это должно сделать то, что вам нужно:

$(document).ready(function() {
  $('#ourForm').submit(function(e){
      var form = this;
      e.preventDefault();
      // Check Passwords are the same
      if( $('#pass1').val()==$('#pass2').val() ) {
          // Submit Form
          alert('Passwords Match, submitting form');
          form.submit();
      } else {
          // Complain bitterly
          alert('Password Mismatch');
          return false;
      }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="ourForm">
    <input type="password" name="password" id="pass1" placeholder="Password" required>
    <input type="password" name="password" id="pass2" placeholder="Repeat Password" required>
    <input type="submit" value="Go">
</form>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.