คุณต้องการฟิลด์แบบฟอร์มสองช่องเพื่อจับคู่กับ HTML5 หรือไม่


99

มีวิธีกำหนดให้รายการในช่องฟอร์มสองช่องจับคู่โดยใช้ HTML5 หรือไม่? หรือว่ายังต้องทำ javascript? ตัวอย่างเช่นหากคุณมีช่องรหัสผ่านสองช่องและต้องการให้แน่ใจว่าผู้ใช้ป้อนข้อมูลเดียวกันในแต่ละช่องมีแอตทริบิวต์หรือการเข้ารหัสอื่น ๆ ที่สามารถทำได้หรือไม่เพื่อให้บรรลุเป้าหมายนี้


นั่นเป็นจุดที่ดี อย่างไรก็ตามฉันต้องการใช้วิธี HTML5 ด้วยหากมีอยู่
user981178

ปัญหาที่ฉันพบในการจับคู่รูปแบบ regex ใน HTML5 คืออักขระพิเศษใด ๆ ถูกจับคู่: รหัสผ่าน: Cat $ ยืนยันรหัสผ่าน: Cat @ จะสร้างการจับคู่ในการยืนยันฟิลด์แม้ว่าฉันจะมีสคริปต์ตรวจสอบความถูกต้องของฉันที่ไม่อนุญาตให้ส่งสิ่งนี้ให้ ตัวบ่งชี้เท็จสำหรับผู้ใช้
เดินป่า

คำตอบ:


88

ไม่ตรงกับการตรวจสอบ 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 Johnson

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>

49
แม้ว่าวิธีนี้จะได้ผล แต่ก็ยังคงเป็นคำตอบที่ไม่ดีด้วยเหตุผลสองประการ: คุณอ้างว่านี่เป็นวิธีแก้ปัญหาแบบ html เท่านั้นซึ่งไม่ใช่และคุณไม่ได้อธิบายวิธีการทำงาน
wvdz

8
นั่นอาจเป็นเรื่องจริง แม้ว่าจะเป็นคำตอบที่ไม่ดี แต่ก็เป็นวิธีแก้ปัญหาที่เรียบร้อย เมื่อป้อนค่าลงในฟิลด์แรกจะทำการตรวจสอบรูปแบบรหัสผ่านที่กำหนดไว้สำหรับอินพุตนั้น หากไม่พอดีกับรูปแบบ pw ของคุณมันจะแสดงข้อความ หากตรงกับรูปแบบที่คุณต้องการระบบจะเปลี่ยนรูปแบบที่ต้องการสำหรับฟิลด์ pw ที่สองให้เป็นค่าที่ผู้ใช้ป้อน หากผู้ใช้ป้อนบางสิ่งในฟิลด์ที่สองจะต้องเป็นค่าจากฟิลด์แรกมิฉะนั้นข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น สวยดี ฉันกำลังคิดอยู่บ้างว่าสิ่งนี้ก่อให้เกิดปัญหาด้านความปลอดภัยหรือไม่ ฉันไม่คิดว่ามันจะ ...
Brian Layman

5
เคล็ดลับในที่นี้คือ "form.password_two.pattern = this.value" ซึ่งจะทำลายด้วยอักขระพิเศษที่มีความหมายพิเศษใน regexps
dequis

1
@wvdz ไม่เคยบอกว่าเป็น HTML แท้ แต่เพิ่มลิงก์ความเข้ากันได้ของเบราว์เซอร์เพื่อความชัดเจน
Francisco Costa

1
ฉันเชื่อว่าpatternควรละแอตทริบิวต์สำหรับpassword_twoฟิลด์นี้ ในปัจจุบันหากคุณพิมพ์รหัสผ่านซึ่งมีความยาวไม่เกิน 6 อักขระในpassword_twoช่องโดยpasswordเว้นว่างไว้ระบบจะแสดงPlease enter the same Password as aboveข้อความตรวจสอบความถูกต้อง สิ่งที่อาจทำให้สับสนมากขึ้น: สิ่งเดียวกันจะเกิดขึ้นหากคุณใส่รหัสผ่านเดียวกันในทั้งสองช่องซึ่งสั้นกว่า 6 ตัวอักษร

13

วิธีแก้ปัญหาง่ายๆด้วยจาวาสคริปต์น้อยที่สุดคือการใช้รูปแบบแอตทริบิวต์ html (รองรับโดยเบราว์เซอร์ที่ทันสมัยส่วนใหญ่ ) ซึ่งทำงานได้โดยตั้งค่ารูปแบบของฟิลด์ที่สองเป็นค่าของฟิลด์แรก

น่าเสียดายที่คุณต้องหลีกเลี่ยง regex ซึ่งไม่มีฟังก์ชันมาตรฐานอยู่

<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

5

จำเป็นต้องใช้ 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>

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

คำตอบที่ว่ารูปแบบการใช้งานและ 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.