HTML5 ile eşleşmesi için iki form alanı gerekli olabilir mi?


99

İki form alanındaki girişlerin HTML5 kullanılarak eşleşmesini zorunlu kılmanın bir yolu var mı? Yoksa bunun hala javascript ile yapılması gerekiyor mu? Örneğin, iki şifre alanınız varsa ve bir kullanıcının her alana aynı verileri girdiğinden emin olmak istiyorsanız, bunu başarmak için yapılabilecek bazı özellikler veya başka kodlamalar var mı?


Bu iyi bir nokta. Bununla birlikte, eğer varsa HTML5 yöntemini de uygulayabilmek isterim.
user981178

HTML5'te normal ifade kalıbı eşleştirmesiyle karşılaştığım sorun, herhangi bir özel karakterin eşleştirilmesidir: şifre: Cat $ onayla şifre: Cat @, alan onayında bir eşleşme üretecek. kullanıcıya yanlış gösterge.
2017 saat

Yanıtlar:


88

Tam olarak HTML5 doğrulamasıyla değil, ancak biraz JavaScript sorunu çözebilir, aşağıdaki örneği izleyin:

<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
Eğer: 1. her iki şifreyi de aynı şekilde yazarsak ve sonra 2. ilk şifre alanına geri dönüp oradaki değeri değiştirirsek bu kod bir sorunla karşılaşır mı?
Mladen B.

Evet, örneğin ilk alana 'abc' ve ikinci alana 'bcd' girip ilk alandaki 'abc'yi' bcd 'şifreleri eşleşecek şekilde değiştirirseniz, ancak yine de alacaksınız geçersiz giriş mesajı.
Roel Koops

Yukarıdaki yorumlarda bahsedilen konular şu şekilde ele alınabilir: 1) oninput="check(this)"İlk şifre alanına ekleyerek ve 2) input.valueişlevi olarak değiştirerek document.getElementById('password_confirm').value. Demek kiif (document.getElementById('password_confirm').value != document.getElementById('password').value)
Kodos Johnson

32

Normal ifadeler Giriş Kalıpları ile yapabilirsiniz ( tarayıcı uyumluluğunu kontrol edin )

<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
Bu işe yarasa da, iki nedenden ötürü hala kötü bir cevap: bunun yalnızca html içeren bir çözüm olduğunu iddia ediyorsunuz, öyle değil ve nasıl çalıştığını açıklamıyorsunuz.
wvdz

8
Bu muhtemelen doğrudur. Yine de kötü bir cevap olsa da, düzgün bir çözüm. İlk alana bir değer girildiğinde, o giriş için tanımlanan şifre kalıbı kontrolünü yapar. Pw deseninize uymuyorsa, bir mesaj görüntüler. Gerekli kalıbınızla eşleşirse, ikinci pw alanı için gerekli kalıbı kullanıcının girdiği değer olacak şekilde değiştirir. Kullanıcı ikinci alana bir şey girerse, ilk alandaki değer olmalıdır veya hata mesajı görüntülenir. Çok hoş. Bunun herhangi bir güvenlik sorunu oluşturup oluşturmayacağı konusunda biraz kafa yoruyorum. Sanmıyorum ...
Brian Layman

5
Buradaki hile "form.password_two.pattern = this.value" olup, normal ifadelerde özel anlamı olan özel karakterleri ortadan
kaldıracaktır

1
@wvdz hiçbir zaman saf HTML olduğunu söylemedi, ancak netlik için tarayıcı uyumluluğu bağlantısını ekledi
Francisco Costa

1
Alan patterniçin özniteliğin atlanması gerektiğine inanıyorum password_two. Şu anda olduğu gibi, boş password_twobırakarak alana 6 karakterden daha kısa bir şifre yazarsanız, doğrulama mesajı passwordgösterecektir Please enter the same Password as above. Daha kafa karıştırıcı olabilir: Her iki alana da 6 karakterden daha kısa olan aynı şifreyi girerseniz aynı şey olur.

13

Minimal javascript ile basit bir çözüm, html öznitelik modelini kullanmaktır ( çoğu modern tarayıcı tarafından desteklenir ). Bu, ikinci alanın modelini birinci alanın değerine ayarlayarak çalışır.

Maalesef, standart bir işlevi olmayan normal ifadeden de çıkmanız gerekir.

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

Bunun için teşekkürler; İşlevi doğrudan işleyiciye koyabildim, ancak onaya bir kimlik koymak zorunda kaldım: <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>Sizinki gibi okunamaz, ancak ayrı komut dosyası / işlevi kullanmaktan kaçınır.
David Brown

4

JavaScript gerekli olacaktır, ancak karşılaştırmayı gerçekleştirmek için bir aracı <output>öğe ve bir oninputform işleyici kullanılarak kod miktarı minimumda tutulabilir (kalıplar ve doğrulama bu çözümü artırabilir, ancak basitlik adına burada gösterilmemiştir):

<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

Sadece HTML5 değil, biraz da JavaScript
[Buraya] tıklayın 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

Desen ve bir normal ifade kullanan cevaplar, kullanıcının parolasını giriş özelliklerine düz metin olarak yazar pattern='mypassword'. Bu yalnızca geliştirici araçları açıksa görülebilir, ancak yine de iyi bir fikir gibi görünmüyor.

Eşleşmeyi kontrol etmek için desen kullanmanın diğer bir sorunu, parolanın doğru biçimde olup olmadığını kontrol etmek için desen kullanmak isteyebilmenizdir, örneğin karışık harfler ve sayılar.

Ayrıca kullanıcı girişler arasında geçiş yaparsa bu yöntemlerin işe yaramayacağını düşünüyorum.

İşte biraz daha JavaScript kullanan ancak girişlerden biri güncellendiğinde basit bir eşitlik kontrolü yapan ve ardından özel bir HTML geçerliliği ayarlayan çözümüm. Her iki giriş de e-posta formatı veya parola karmaşıklığı gibi bir model için test edilebilir.

Gerçek bir sayfa için giriş türlerini 'parola' olarak değiştirirsiniz.

<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

Diğer yanıtlarda da belirtildiği gibi, bunu yapmanın saf HTML5 yolu yoktur.

Zaten JQuery kullanıyorsanız , ihtiyacınız olan şeyi yapmanız gerekir:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.