2016-03-05 18 views
6

Tôi vừa bắt đầu học JS, Jquery và HTML trực tuyến. Tôi có một câu hỏi, và đã cố gắng làm những điều được kể trong câu trả lời của các câu hỏi tương tự trên SO, nhưng nó sẽ không giúp ích gì.Xác thực tùy chỉnh JQuery và HTML5 không hoạt động như dự định

Tôi có biểu mẫu mật khẩu chỉ chấp nhận đầu vào có ít nhất 6 ký tự, một chữ hoa và một số. Tôi muốn hiển thị thông báo xác thực tùy chỉnh có thể chỉ nêu rõ các điều kiện này.

Đây là mã HTML của tôi -

<div class="password"> 
    <label for="password"> Password </label> 
     <input type="password" class="passwrdforsignup" name="password" required pattern="(?=.*\d)(?=.*[A-Z]).{6,}"> <!--pw must contain atleast 6 characters, one uppercase and one number--> 
    </div> 

Tôi đang sử dụng JS để thiết lập các thông điệp xác nhận tùy chỉnh.

mã JS

$(document).ready(function() { 

    $('.password').on('keyup', '.passwrdforsignup', function() { 
     var getPW = $(this).value(); 
     if (getPW.checkValidity() === false) { 
      getPW.setCustomValidity("This password doesn't match the format specified"); 
     } 

    }); 

}); 

Tuy nhiên, thông điệp xác nhận tùy chỉnh không hiển thị. Hãy giúp tôi. Cảm ơn trước! :)

CẬP NHẬT 1

tôi đã thay đổi mô hình mật khẩu để (?=.*\d)(?=.*[A-Z])(.{6,}). Dựa trên lời khuyên của 4castle, tôi nhận ra có một vài lỗi trong javascript của tôi, và thay đổi chúng cho phù hợp. Tuy nhiên, thông báo xác thực tùy chỉnh vẫn không hiển thị.

JavaScript:

$(document).ready(function() { 

    $('.password').on('keyup', '.passwrdforsignup', function() { 
     var getPW = $(this).find('.passwrdforsignup').get();  
     if (getPW.checkValidity() === false) { 
      getPW.setCustomValidity("This password doesn't match the format specified"); 
     } 

    }); 

}); 

Một lần nữa, so với tất cả các bạn trước!

+0

@thisOneGuy, no. 'required' là một cờ và' pattern' là một thuộc tính. Nó có thể được viết như: 'required =" true "pattern =" blah "'. –

+0

@ jsve cảm ơn, đã không đi qua rằng trước khi – thatOneGuy

+0

Thay đổi mô hình của bạn để '(? =. * \ D) (? =. * [AZ]) (. {6,})' để có một nhóm chụp . – 4castle

Trả lời

3

Thứ nhất, cập nhật này:

var getPW = $(this).find('.passwrdforsignup').get(); 

này:

var getPW = $(this).get(0); 

... vì $ (đây) đã là hộp văn bản .passwrdforsignup, bạn không thể tự tìm thấy nó!

Sự cố với setCustomValidity là, nó chỉ hoạt động khi bạn gửi biểu mẫu.Vì vậy, có những lựa chọn để thực hiện chính xác rằng:

$(function() { 
    $('.password').on('keyup', '.passwrdforsignup', function() { 
     var getPW = $(this).get(0);  
     getPW.setCustomValidity(""); 
     if (getPW.checkValidity() === false) { 
      getPW.setCustomValidity("This password doesn't match the format specified"); 
      $('#do_submit').click(); 
     } 
    }); 
}); 

Xin lưu ý getPW.setCustomValidity(""); mà resets thông điệp đó là quan trọng bởi vì nếu bạn không làm điều này, getPW.checkValidity() sẽ luôn được false!

Để làm việc này, hộp văn bản (và nút gửi) phải nằm trong một số form.

Working JSFiddle

+0

Cảm ơn bạn rất nhiều WcPc. Giải pháp chi tiết giúp tôi hiểu rõ nơi tôi đã sai! Thực sự đánh giá cao nó! Thông báo xác thực tùy chỉnh giờ đây xuất hiện như dự định. –

+0

Bạn được chào đón :) – WcPc

3

Có một số vấn đề xảy ra ở đây.

  1. Mẫu không có nhóm chụp, vì vậy về mặt kỹ thuật không có gì có thể khớp với nó. Thay đổi mẫu thành (?=.*\d)(?=.*[A-Z])(.{6,})
  2. $(this).value() không đề cập đến giá trị của thẻ input, nó đề cập đến giá trị của .password là div vùng chứa.
  3. getPW.checkValidity()getPW.setCustomValidity("blah") đang chạy trên chuỗi, không có định nghĩa cho các chức năng đó, chỉ các đối tượng DOM làm.

Dưới đây là những gì bạn nên làm thay vì (mã JS từ this SO answer)

$(document).ready(function() { 
 
    $('.passwrdforsignup').on('invalid', function(e) { 
 
    var getPW = e.target; 
 
    getPW.setCustomValidity(""); 
 
    if (!getPW.checkValidity()) 
 
     getPW.setCustomValidity("This password doesn't match the format specified"); 
 
    }).on('input', function(e) { 
 
    $(this).get().setCustomValidity(""); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<form> 
 
    <div class="password"> 
 
    <label for="password">Password</label> 
 
    <input type="password" class="passwrdforsignup" name="password" 
 
      required pattern="(?=.*\d)(?=.*[A-Z])(.{6,})" /> 
 
    </div> 
 
    <input type="submit" /> 
 
</form>

+0

Cảm ơn các điểm 4Castle! Tôi sẽ thực hiện các thay đổi cần thiết. Tuy nhiên, đối với điểm 3, tôi nghĩ checkValidity() tự động kiểm tra tính hợp lệ của đầu vào (như được hiển thị trong http://www.w3schools.com/js/js_validation_api.asp). Tôi dựa trên chức năng của tôi về điều này. Đây có phải là thư viện riêng biệt mà tôi cần liên kết tới không? –

+0

Woah! Xin lỗi, những chức năng đó là mới đối với tôi. Nó cho thấy trên trang đó rằng họ phải được chạy trên các đối tượng DOM mặc dù, vì vậy tôi đã thay đổi câu trả lời của tôi bây giờ để nó là chính xác. Cảm ơn nhiều! – 4castle

+0

Xin chào 4castle, cảm ơn câu trả lời đã được cập nhật. Tuy nhiên, nó vẫn không làm các trick. Đây là mã của tôi một lần nữa - '$ (tài liệu) .ready (function() { $ ('. Password'). ('Keyup', '.passwrdforsignup', function() { var getPW = $ (này) .find ('. passwrdforsignup'). get(); if (getPW.checkValidity() === false) { getPW.setCustomValidity ("Mật khẩu này không khớp với định dạng được chỉ định"); } }); }); ' –

Các vấn đề liên quan