2012-11-30 6 views
22

जब मैं एक अवैध मूल्य के साथ जावास्क्रिप्ट में textarea.checkValidity() या textarea.validity.valid का उपयोग करता हूं, तो वे हमेशा सत्य लौटते हैं, मैं क्या गलत कर रहा हूं?टेक्स्टरेरा में पैटर्न मिलान को कैसे सत्यापित करें?

<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

लगता है [ '' textarea' pattern' विशेषता नहीं है] (https: // developer.mozilla.org/en-US/docs/HTML/HTML_Elements/textarea?redirectlocale=en-US&redirectslug=HTML%2FElement%2Ftextarea), इसलिए संभावना है कि ब्राउज़र इसे अनदेखा कर देंगे। – Passerby

उत्तर

18

एचटीएमएल 5 <textarea> तत्व pattern विशेषता का समर्थन नहीं करता।

<textarea> विशेषताओं के लिए MDN doc देखें।

आपको इस कार्यक्षमता को स्वयं परिभाषित करने की आवश्यकता हो सकती है।

या ऐसा करने के लिए जावास्क्रिप्ट/jQuery फ़ंक्शन को परिभाषित करने के पारंपरिक HTML 4 अभ्यास का पालन करें।

7

आप इसे setCustomValidity() के साथ स्वयं लागू कर सकते हैं। इस तरह, this.checkValidity() आपके तत्व पर लागू होने वाले नियमों का उत्तर देगा। मुझे नहीं लगता कि this.validity.patternMismatch मैन्युअल रूप से सेट हो सकता है, लेकिन यदि आवश्यक हो तो आप अपनी संपत्ति का उपयोग कर सकते हैं।

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

अच्छा जवाब और पहेली के लिए धन्यवाद। यह मेरी मदद की! –

+0

धन्यवाद, खुशी है कि मैं मदद कर सकता हूं। :) –

5

यह डोम में सभी textareas पर pattern विशेषता सक्षम और HTML5 सत्यापन ट्रिगर किया जाएगा। यह भी है कि ^ या $ ऑपरेटरों खाता पैटर्न में ले जाता है और करता है एक वैश्विक मैच g 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

हाँ, यह क्लीनर है। :) दरअसल, इनपुट में पैटर्न विशेषता regexp में '^' और '$' की अनुमति देती है भले ही वे अंतर्निहित हों। –

+0

^और $ प्रतिस्थापन काम नहीं करता है। यह एक वैश्विक (साथ/जी) regexp (स्लेश के साथ) होना चाहिए, स्ट्रिंग में regexp नहीं: 'var patternRegex = new RegExp ('^' + pattern.replace (/^\^| \ $$/g, ' ') +' $ ',' g '); ' –

+0

मैंने इसे प्रत्येक पंक्ति पर एक ईमेल पते की तलाश में एक पहेली पर काम करने की कोशिश की। सबसे अच्छा मैं एक एम संशोधक जोड़ सकता हूं और फिर किसी भी लाइन पर कोई ईमेल पता होने पर यह मेल खाता होगा। अभी भी मैं नहीं चाहता था। यैन का पहला उदाहरण सही ढंग से काम करता है। समस्या को हल करने के बजाय आप इस विधि का उपयोग कैसे करेंगे? यहां मैंने जो पहेली बनाई है: http://jsfiddle.net/da1hg19e/ –

संबंधित मुद्दे