HTML5と一致する2つのフォームフィールドが必要ですか?


98

HTML5を使用して2つのフォームフィールドのエントリを一致させる必要がある方法はありますか?それともこれはまだJavaScriptで行う必要がありますか?たとえば、2つのパスワードフィールドがあり、ユーザーが各フィールドに同じデータを入力したことを確認したい場合、これを実現するために実行できる属性やその他のコーディングはありますか?


まあ、それは良い点です。ただし、HTML5が存在する場合は、それも実装できるようにしたいと考えています。
user981178 2012

HTML5の正規表現パターンマッチングで発生した問題は、特殊文字が一致することです。パスワード:Cat $確認パスワード:Cat @はフィールド確認で一致を生成します提出を許可しない検証スクリプトがありますが、これにより、ユーザーへの偽のインジケータ。
trekkabout

回答:


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」、2番目のフィールドに「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>

45
これは機能しますが、これは2つの理由で依然として悪い答えです。これはHTMLのみのソリューションであると主張しているが、機能しておらず、機能の説明をしていません。
wvdz 2014年

8
それはおそらく本当です。それでも悪い答えですが、それはきちんとした解決策です。最初のフィールドに値を入力すると、その入力に対して定義されているパスワードパターンチェックが実行されます。pwパターンに適合しない場合は、メッセージを表示します。必要なパターンと一致する場合は、2番目のpwフィールドの必要なパターンをユーザーが入力した値に変更します。ユーザーが2番目のフィールドに何かを入力した場合、それは最初のフィールドの値である必要があります。そうでない場合、エラーメッセージが表示されます。かなりいい。これがセキュリティ上の問題を引き起こすかどうかについて、私は少し考えています。私はそうは思わない...
ブライアン・レイマン'30

5
ここでのトリックは「form.password_two.pattern = this.value」で、正規表現で特別な意味を持つ特殊文字で壊れます
dequis

1
@wvdzは純粋なHTMLであるとは決して述べていませんが、明確にするためにブラウザ互換性リンクを追加しました
Francisco Costa

1
フィールドのpattern属性は省略すべきだと思いpassword_twoます。現在と同じように、password_twoフィールドに6文字より短いパスワードを入力し、password空のままにすると、Please enter the same Password as above検証メッセージが表示されます。さらに混乱するかもしれません。両方のフィールドにまったく同じパスワードを入力すると、同じことが起こります。つまり、6文字より短いです。

13

最小限のJavaScriptを使用した簡単な解決策は、html属性パターンを使用することです(ほとんどの最新のブラウザーでサポートされています)。これは、2番目のフィールドのパターンを最初のフィールドの値に設定することで機能します。

残念ながら、標準関数が存在しない正規表現もエスケープする必要があります。

<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='mypassword'。これは、開発者ツールが開いている場合にのみ表示されますが、それでも良い考えではないようです。

パターンを使用して一致を確認する際のもう1つの問題は、パターンを使用してパスワードが正しい形式(文字と数字が混在しているなど)であることを確認することです。

また、ユーザーが入力を切り替えた場合、これらの方法はうまく機能しないと思います。

これは、もう少し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.