Você pode exigir dois campos de formulário para corresponder ao HTML5?

98

Existe uma maneira de exigir que as entradas em dois campos do formulário correspondam usando HTML5? Ou isso ainda precisa ser feito com javascript? Por exemplo, se você tiver dois campos de senha e quiser ter certeza de que um usuário inseriu os mesmos dados em cada campo, há alguns atributos ou outra codificação que pode ser feita para conseguir isso?

user981178
fonte
Bem, esse é um bom ponto. No entanto, também gostaria de poder implementar a forma HTML5, se ela existir.
user981178
O problema que encontrei com a correspondência de padrão regex em HTML5 é que qualquer caractere especial é correspondido: senha: Cat $ confirmar senha: Cat @ produzirá uma correspondência no campo de confirmação Embora eu tenha meu script de validação que não permitirá o envio, ele fornece um indicador falso para o usuário.
trekkabout

Respostas:

86

Não exatamente com a validação HTML5, mas um pouco de JavaScript pode resolver o problema. Siga o exemplo abaixo:

<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
fonte
1
esse código teria um problema se nós: 1. digitássemos as duas senhas iguais e, em seguida, 2. voltássemos ao primeiro campo de senha e alterássemos o valor lá?
Mladen B.
Sim, e se você, por exemplo, inserir 'abc' no primeiro campo e 'bcd' no segundo campo, e então alterar o 'abc' no primeiro campo para 'bcd', as senhas são correspondentes, mas você ainda obterá o mensagem de entrada inválida.
Roel Koops de
Os problemas mencionados nos comentários acima podem ser solucionados: 1) Adicionando oninput="check(this)"ao primeiro campo de senha e 2) alterando input.valuea função para document.getElementById('password_confirm').value. Assim se tornaif (document.getElementById('password_confirm').value != document.getElementById('password').value)
Kodos Johnson
32

Você pode, com expressões regulares, padrões de entrada (verifique a compatibilidade do 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
fonte
45
Embora funcione, ainda é uma resposta ruim por dois motivos: você afirma que esta é uma solução somente html, o que não é, e não explica como funciona.
wvdz
8
Provavelmente é verdade. No entanto, embora seja uma resposta ruim, é uma solução interessante. Quando um valor é inserido no primeiro campo, ele faz a verificação do padrão de senha definido para aquela entrada. Se não se encaixa no seu padrão pw, ele exibe uma mensagem. Se corresponder ao seu padrão exigido, ele altera o padrão exigido para o segundo campo pw para ser o valor que o usuário inseriu. Se o usuário inserir algo no segundo campo, deve ser o valor do primeiro campo ou a mensagem de erro será exibida. Muito bom. Estou pensando se isso representa algum problema de segurança. Acho que não ...
Brian Layman
5
O truque aqui é "form.password_two.pattern = this.value", que será interrompido com caracteres especiais que têm um significado especial em
regexps
1
@wvdz nunca disse que é HTML puro, mas adicionou o link de compatibilidade do navegador para maior clareza
Francisco Costa
1
Eu acredito que o patternatributo deve ser omitido para o password_twocampo. Como atualmente, se você digitar uma senha, que tem menos de 6 caracteres no password_twocampo, deixando em passwordbranco - ela mostrará uma Please enter the same Password as abovemensagem de validação. O que pode ser mais confuso: a mesma coisa acontece se você colocar nos dois campos exatamente a mesma senha, que é menor que 6 caracteres.
13

Uma solução simples com javascript mínimo é usar o padrão de atributo html (compatível com a maioria dos navegadores modernos). Isso funciona definindo o padrão do segundo campo com o valor do primeiro campo.

Infelizmente, você também precisa escapar da regex, para a qual não existe uma função padrão.

<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
fonte
Obrigado por isso; Consegui colocar a função diretamente no manipulador, mas tive que colocar um ID na confirmação: <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>Não legível como o seu, mas evita o script / função separada.
David Brown,
4

O JavaScript será necessário, mas a quantidade de código pode ser reduzida ao mínimo usando um <output>elemento intermediário e um oninputmanipulador de formulários para realizar a comparação (padrões e validação podem aumentar esta solução, mas não são mostrados aqui por uma questão de simplicidade):

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

Não apenas HTML5, mas um pouco de JavaScript
Clique [aqui] 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
fonte
0

As respostas que usam padrão e regex gravam a senha do usuário nas propriedades de entrada como texto simples pattern='mypassword'. Isso só ficará visível se as ferramentas do desenvolvedor estiverem abertas, mas ainda não parece uma boa ideia.

Outro problema com o uso de padrão para verificar uma correspondência é que você provavelmente desejará usar o padrão para verificar se a senha está no formato correto, por exemplo, letras e números mistos.

Também acho que esses métodos não funcionarão bem se o usuário alternar entre as entradas.

Esta é minha solução que usa um pouco mais de JavaScript, mas executa uma verificação de igualdade simples quando qualquer entrada é atualizada e, em seguida, define uma validade de HTML personalizado. Ambas as entradas ainda podem ser testadas para um padrão, como formato de e-mail ou complexidade de senha.

Para uma página real, você mudaria os tipos de entrada para 'senha'.

<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>
Pequeno cérebro
fonte
0

Como foi mencionado em outras respostas, não existe uma maneira pura de HTML5 de fazer isso.

Se você já estiver usando JQuery , isso deve fazer o que você precisa:

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