¿Puede requerir dos campos de formulario para que coincidan con HTML5?

98

¿Hay alguna manera de requerir que las entradas en dos campos de formulario coincidan usando HTML5? ¿O todavía hay que hacer esto con javascript? Por ejemplo, si tiene dos campos de contraseña y desea asegurarse de que un usuario haya ingresado los mismos datos en cada campo, ¿existen algunos atributos u otra codificación que se pueda hacer para lograrlo?

usuario981178
fuente
Bueno, ese es un buen punto. Sin embargo, también me gustaría poder implementar la forma HTML5, si existe.
user981178
El problema que he encontrado con la coincidencia de patrones de expresiones regulares en HTML5 es que cualquier carácter especial coincide: contraseña: Cat $ confirmar contraseña: Cat @ producirá una coincidencia en la confirmación del campo Aunque tengo mi script de validación que no permitirá el envío, esto proporciona un indicador falso para el usuario.
Trekka alrededor

Respuestas:

86

No exactamente con la validación de HTML5, pero un poco de JavaScript puede resolver el problema, siga el ejemplo a continuación:

<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" />
Faisal
fuente
1
¿Este código experimentaría un problema si: 1. escribimos ambas contraseñas de la misma manera y luego 2. volvemos al primer campo de contraseña y cambiamos el valor allí?
Mladen B.
Sí, y si, por ejemplo, ingresa 'abc' en el primer campo y 'bcd' en el segundo campo, y luego cambia el 'abc' en el primer campo a 'bcd', las contraseñas coinciden, pero aún obtendrá la mensaje de entrada inválido.
Roel Koops
Los problemas mencionados en los comentarios anteriores se pueden solucionar: 1) agregando oninput="check(this)"al primer campo de contraseña y 2) cambiando input.valuela función a document.getElementById('password_confirm').value. Así se convierte enif (document.getElementById('password_confirm').value != document.getElementById('password').value)
Kodos Johnson
32

Puede hacerlo con patrones de entrada de expresiones regulares (compruebe la compatibilidad del navegador )

<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>
Francisco Costa
fuente
45
Si bien esto funciona, sigue siendo una mala respuesta por dos razones: afirma que se trata de una solución solo en HTML, que no lo es, y no explica cómo funciona.
wvdz
8
Probablemente eso sea cierto. Sin embargo, si bien es una mala respuesta, es una buena solución. Cuando se ingresa un valor en el primer campo, realiza la verificación del patrón de contraseña definida para esa entrada. Si no se ajusta a su patrón pw, muestra un mensaje. Si coincide con su patrón requerido, cambia el patrón requerido para que el segundo campo pw sea el valor que ingresó el usuario. Si el usuario ingresa algo en el segundo campo, debe ser el valor del primer campo o se mostrará el mensaje de error. Bastante agradable. Estoy pensando en si esto plantea algún problema de seguridad. No creo que lo haga ...
Brian Layman
5
El truco aquí es "form.password_two.pattern = this.value", que se romperá con caracteres especiales que tienen un significado especial en las expresiones regulares
dequis
1
@wvdz nunca dijo que es HTML puro, pero agregó el enlace de compatibilidad del navegador para mayor claridad
Francisco Costa
1
Creo que el patternatributo debería omitirse para el password_twocampo. Como actualmente, si escribe una contraseña, que tiene menos de 6 caracteres en el password_twocampo, mientras la deja passwordvacía, mostrará un Please enter the same Password as abovemensaje de validación. Lo que podría ser más confuso: lo mismo sucede si ingresa en ambos campos exactamente la misma contraseña, que tiene menos de 6 caracteres.
13

Una solución simple con un mínimo de javascript es utilizar el patrón de atributo html (compatible con la mayoría de los navegadores modernos). Esto funciona estableciendo el patrón del segundo campo en el valor del primer campo.

Desafortunadamente, también necesita escapar de la expresión regular, para la cual no existe una función estándar.

<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>
wvdz
fuente
Gracias por esto; Pude poner la función directamente en el controlador, pero tuve que poner una identificación en la confirmación: <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>no legible como el suyo, pero evita el script / función por separado.
David Brown
4

Se requerirá JavaScript, pero la cantidad de código se puede mantener al mínimo mediante el uso de un <output>elemento intermediario y un oninputcontrolador de formulario para realizar la comparación (los patrones y la validación podrían aumentar esta solución, pero no se muestran aquí por simplicidad):

<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>
ptrdo
fuente
2

No solo HTML5 sino un poco de JavaScript
Haga clic [aquí] 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;
EfisioBova
fuente
0

Las respuestas que usan patrón y una expresión regular escriben la contraseña del usuario en las propiedades de entrada como texto sin formato pattern='mypassword'. Esto solo será visible si las herramientas de desarrollo están abiertas, pero aún así no parece una buena idea.

Otro problema con el uso de patrón para verificar una coincidencia es que probablemente desee usar patrón para verificar que la contraseña tiene la forma correcta, por ejemplo, letras y números mezclados.

También creo que estos métodos no funcionarán bien si el usuario cambia entre entradas.

Aquí está mi solución que usa un poco más de JavaScript pero realiza una simple verificación de igualdad cuando se actualiza cualquiera de las entradas y luego establece una validez HTML personalizada. Ambas entradas aún se pueden probar para un patrón como el formato de correo electrónico o la complejidad de la contraseña.

Para una página real, cambiaría los tipos de entrada a 'contraseña'.

<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>
Pequeño cerebro
fuente
0

Como se ha mencionado en otras respuestas, no existe una forma puramente HTML5 de hacer esto.

Si ya está utilizando JQuery , esto debería hacer lo que necesita:

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

AreaEuro
fuente