HTML5와 일치하는 두 개의 양식 필드를 요구할 수 있습니까?


98

HTML5를 사용하여 일치하도록 두 양식 필드의 항목을 요구하는 방법이 있습니까? 아니면 여전히 자바 스크립트로해야합니까? 예를 들어, 두 개의 비밀번호 필드가 있고 사용자가 각 필드에 동일한 데이터를 입력했는지 확인하려는 경우이를 달성하기 위해 수행 할 수있는 몇 가지 속성 또는 기타 코딩이 있습니까?


글쎄요, 좋은 지적입니다. 그러나 HTML5 방식이 있으면 구현할 수 있기를 바랍니다.
user981178

HTML5에서 정규식 패턴 일치에서 발생한 문제는 특수 문자가 일치한다는 것입니다. 사용자에게 거짓 표시기.

답변:


86

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'암호가 일치하는 것으로 변경하지만 여전히 잘못된 입력 메시지입니다.
Roel Koops

위의 설명에서 언급 된 문제는 1) oninput="check(this)"첫 번째 암호 필드에 추가 하고 2) input.value함수를 document.getElementById('password_confirm').value. 그래서이된다if (document.getElementById('password_confirm').value != document.getElementById('password').value)
Kodos 존슨

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 필드의 필수 패턴을 사용자가 입력 한 값으로 변경합니다. 사용자가 두 번째 필드에 무언가를 입력하면 첫 번째 필드의 값이어야합니다. 그렇지 않으면 오류 메시지가 표시됩니다. 꽤 좋은. 이것이 보안 문제를 일으키는 지 여부에 대해 생각하고 있습니다. 나는 그것을하지 생각하지 않는다 ...
브라이언 뜻하는

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

최소한의 자바 스크립트를 사용하는 간단한 솔루션은 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>

감사합니다. 함수를 핸들러에 직접 넣을 수 있었지만 확인시 ID를 넣어야했습니다. <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>당신처럼 읽을 수 없지만 별도의 스크립트 / 함수를 피했습니다.
David Brown

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>

자바 스크립트

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과 regex를 사용하는 답변은 사용자의 비밀번호를 입력 속성에 일반 텍스트로 씁니다 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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.