Czy możesz wymagać dwóch pól formularza, aby pasowały do ​​HTML5?


98

Czy istnieje sposób, aby wpisy w dwóch polach formularza były zgodne z HTML5? A może nadal trzeba to zrobić za pomocą JavaScript? Na przykład, jeśli masz dwa pola hasła i chcesz się upewnić, że użytkownik wprowadził te same dane w każdym polu, czy są jakieś atrybuty lub inne kodowanie, które można wykonać, aby to osiągnąć?


Cóż, to dobra uwaga. Chciałbym jednak również móc zaimplementować sposób HTML5, jeśli taki istnieje.
user981178

Problem, który napotkałem z dopasowywaniem wzorców regex w HTML5 polega na tym, że dopasowywany jest dowolny znak specjalny: hasło: Cat $ potwierdź hasło: Cat @ wyświetli dopasowanie w potwierdzeniu pola Chociaż mam swój skrypt walidacyjny, który nie pozwala na przesłanie, zapewnia to fałszywy wskaźnik dla użytkownika.
trekkabout

Odpowiedzi:


86

Niezupełnie z walidacją HTML5, ale trochę JavaScript może rozwiązać problem, postępuj zgodnie z poniższym przykładem:

<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
czy wystąpiłby problem z tym kodem, gdybyśmy: 1. wpisali oba hasła takie same, a następnie 2. wrócili do pierwszego pola hasła i zmienili tam wartość?
Mladen B.

Tak, jeśli na przykład wpiszesz „abc” w pierwszym polu, a „bcd” w drugim, a następnie zmienisz „abc” w pierwszym polu na „bcd”, hasła są zgodne, ale nadal otrzymasz nieprawidłowy komunikat wejściowy.
Roel Koops,

Kwestie poruszone w powyższych komentarzach można rozwiązać poprzez: 1) dodanie oninput="check(this)"do pierwszego pola hasła oraz 2) zmianę input.valuefunkcji na document.getElementById('password_confirm').value. I tak się stałoif (document.getElementById('password_confirm').value != document.getElementById('password').value)
Kodos Johnson,

32

Możesz z wyrażeniami regularnymi Wzorce wejściowe (sprawdź zgodność przeglądarki )

<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
Chociaż to działa, nadal jest to zła odpowiedź z dwóch powodów: twierdzisz, że jest to rozwiązanie tylko w formacie HTML, a tak nie jest, i nie wyjaśniasz, jak to działa.
wvdz

8
To prawdopodobnie prawda. Chociaż jest to zła odpowiedź, jest to zgrabne rozwiązanie. Wprowadzenie wartości do pierwszego pola powoduje sprawdzenie wzorca hasła zdefiniowanego dla tego wejścia. Jeśli nie pasuje do twojego wzorca pw, wyświetla komunikat. Jeśli pasuje do wymaganego wzorca, zmienia wymagany wzorzec drugiego pola pw na wartość wprowadzoną przez użytkownika. Jeśli użytkownik wprowadzi coś w drugie pole, musi to być wartość z pierwszego pola lub zostanie wyświetlony komunikat o błędzie. Nieźle. Zastanawiam się, czy stwarza to jakiekolwiek problemy z bezpieczeństwem. Myślę, że tak nie jest ...
Brian Layman

5
Sztuczka polega na tym, że „form.password_two.pattern = this.value” powoduje zerwanie ze znakami specjalnymi o specjalnym znaczeniu w
wyrażeniach

1
@wvdz nigdy nie powiedział, że to czysty HTML, ale dla jasności dodał link do zgodności przeglądarki
Francisco Costa,

1
Uważam, że patternatrybut powinien zostać pominięty w password_twopolu. Jak obecnie, jeśli wpiszesz hasło, które jest krótsze niż 6 znaków w password_twopole, pozostawiając passwordpuste - wyświetli się Please enter the same Password as abovekomunikat walidacji. Co może być bardziej zagmatwane: to samo stanie się, jeśli w obu polach wpiszesz dokładnie to samo hasło, które jest krótsze niż 6 znaków.

13

Prostym rozwiązaniem z minimalną ilością javascript jest użycie wzorca atrybutu html (obsługiwanego przez większość nowoczesnych przeglądarek). Działa to poprzez ustawienie wzorca drugiego pola na wartość pierwszego pola.

Niestety, musisz też uciec przed wyrażeniem regularnym, dla którego nie istnieje standardowa funkcja.

<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>

Dzięki za to; Udało mi się umieścić funkcję bezpośrednio w module obsługi, ale musiałem umieścić identyfikator na potwierdzeniu: <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>Nieczytelny jak twój, ale unika oddzielnego skryptu / funkcji.
David Brown

4

JavaScript będzie wymagany, ale ilość kodu można ograniczyć do minimum, używając <output>elementu pośredniczącego i oninputmodułu obsługi formularzy do wykonania porównania (wzorce i walidacja mogą rozszerzyć to rozwiązanie, ale nie są tutaj pokazane ze względu na prostotę):

<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

Nie tylko HTML5, ale trochę JavaScript
Kliknij [tutaj] 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

Odpowiedzi, które używają wzorca i wyrażenia regularnego, zapisują hasło użytkownika we właściwościach wejściowych jako zwykły tekst pattern='mypassword'. Będzie to widoczne tylko wtedy, gdy narzędzia programistyczne są otwarte, ale nadal nie wydaje się to dobrym pomysłem.

Innym problemem związanym z używaniem wzorca do sprawdzania zgodności jest to, że prawdopodobnie będziesz chciał użyć wzorca, aby sprawdzić, czy hasło ma odpowiednią postać, np. Mieszane litery i cyfry.

Myślę też, że te metody nie będą działać dobrze, jeśli użytkownik przełączy się między wejściami.

Oto moje rozwiązanie, które używa nieco więcej JavaScript, ale wykonuje proste sprawdzenie równości, gdy dane wejściowe są aktualizowane, a następnie ustawia niestandardową ważność HTML. Oba dane wejściowe można nadal przetestować pod kątem wzorca, takiego jak format wiadomości e-mail lub złożoność hasła.

W przypadku prawdziwej strony zmieniłbyś typ danych wejściowych na „hasło”.

<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

Jak wspomniano w innych odpowiedziach, nie ma na to sposobu w czystym HTML5.

Jeśli korzystasz już z JQuery , to powinno zrobić to, czego potrzebujesz:

$(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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.