2012-11-30 26 views
22

Khi tôi sử dụng textarea.checkValidity() hoặc textarea.validity.valid trong javascript với giá trị không hợp lệ cả hai giá trị này luôn trả về true, tôi đang làm gì sai?Làm cách nào để xác thực tính năng khớp mẫu trong văn bản?

<textarea name="test" pattern="[a-z]{1,30}(,[a-z]{1,30})*" id="test"></textarea>​ 

jQuery('#test').on('keyup', function() { 
    jQuery(this).parent().append('<p>' + this.checkValidity() + ' ' + 
    this.validity.patternMismatch + '</p>'); 
}); 

http://jsfiddle.net/Riesling/jbtRU/9/

+8

vẻ [ 'textarea' không có 'thuộc tính pattern'] (https: // developer.mozilla.org/en-US/docs/HTML/HTML_Elements/textarea?redirectlocale=en-US&redirectslug=HTML%2FElement%2Ftextarea), vì vậy rất có thể các trình duyệt sẽ bỏ qua nó. – Passerby

Trả lời

18

HTML5 <textarea> yếu tố không hỗ trợ thuộc tính pattern.

Xem MDN doc cho các thuộc tính được phép <textarea>.

Bạn có thể cần tự xác định chức năng này.

Hoặc thực hiện theo thực tiễn HTML 4 truyền thống về xác định hàm JavaScript/jQuery để thực hiện việc này.

7

Bạn có thể tự thực hiện việc này với setCustomValidity(). Bằng cách này, this.checkValidity() sẽ trả lời bất kỳ quy tắc nào bạn muốn áp dụng cho phần tử của mình. Tôi không nghĩ rằng this.validity.patternMismatch có thể đặt theo cách thủ công, nhưng bạn có thể sử dụng thuộc tính của riêng mình thay thế, nếu cần.

http://jsfiddle.net/yanndinendal/jbtRU/22/

$('#test').keyup(validateTextarea); 

function validateTextarea() { 
    var errorMsg = "Please match the format requested."; 
    var textarea = this; 
    var pattern = new RegExp('^' + $(textarea).attr('pattern') + '$'); 
    // check each line of text 
    $.each($(this).val().split("\n"), function() { 
     // check if the line matches the pattern 
     var hasError = !this.match(pattern); 
     if (typeof textarea.setCustomValidity === 'function') { 
      textarea.setCustomValidity(hasError ? errorMsg : ''); 
     } else { 
      // Not supported by the browser, fallback to manual error display... 
      $(textarea).toggleClass('error', !!hasError); 
      $(textarea).toggleClass('ok', !hasError); 
      if (hasError) { 
       $(textarea).attr('title', errorMsg); 
      } else { 
       $(textarea).removeAttr('title'); 
      } 
     } 
     return !hasError; 
    }); 
} 
+2

Câu trả lời hay và cảm ơn cho câu chuyện. Nó đã giúp tôi! –

+0

Cảm ơn, vui vì tôi có thể giúp đỡ. :) –

5

này sẽ cho phép các pattern thuộc tính trên tất cả các textareas trong DOM và kích hoạt các xác nhận Html5. Nó cũng sẽ đưa vào mô hình tài khoản đó có ^ hay $ nhà khai thác và thực hiện một trận đấu toàn cầu bằng cách sử dụng g cờ Regex:

$(document).ready(function() { 
    var errorMessage = "Please match the requested format."; 

    $(this).find("textarea").on("input change propertychange", function() { 

     var pattern = $(this).attr("pattern"); 

     if(typeof pattern !== typeof undefined && pattern !== false) 
     { 
      var patternRegex = new RegExp("^" + pattern.replace(/^\^|\$$/g, '') + "$", "g"); 

      hasError = !$(this).val().match(patternRegex); 

      if (typeof this.setCustomValidity === "function") 
      { 
       this.setCustomValidity(hasError ? errorMessage : ""); 
      } 
      else 
      { 
       $(this).toggleClass("error", !!hasError); 
       $(this).toggleClass("ok", !hasError); 

       if (hasError) 
       { 
        $(this).attr("title", errorMessage); 
       } 
       else 
       { 
        $(this).removeAttr("title"); 
       } 
      } 
     } 

    }); 
}); 
+1

Vâng, đó là sạch hơn. :) Thật vậy, thuộc tính pattern trong các đầu vào cho phép '^' và '$' trong regexp mặc dù chúng là ngầm định. –

+0

^và $ thay thế không hoạt động. Nó phải là một regexp toàn cục (với/g) (với dấu gạch chéo), không phải là một regexp trong một chuỗi: 'var patternRegex = new RegExp ('^' + pattern.replace (/^\^| \ $$/g, ' ') +' $ ',' g ');' –

+0

Tôi đã cố gắng làm điều này để tìm kiếm địa chỉ email trên mỗi dòng. Tốt nhất tôi có thể làm thêm một sửa đổi m và sau đó nó sẽ phù hợp nếu có một địa chỉ email trên BẤT CỨ dòng. Vẫn không phải những gì tôi muốn. Ví dụ đầu tiên của Yann ở trên hoạt động chính xác. Bạn sẽ sử dụng phương pháp này để giải quyết vấn đề như thế nào? Đây là fiddle tôi tạo ra: http://jsfiddle.net/da1hg19e/ –

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