2012-01-25 33 views
6

में डेटा-विशेषताओं के आधार पर jQuery सत्यापन नियम जोड़ना मैं data- विशेषताओं के आधार पर नियम जोड़ने की कोशिश कर रहे jQuery validation प्लगइन का उपयोग कर रहा हूं। मैं data-minlength या data-maxlength पर आधारित न्यूनतम/अधिकतम लम्बाई नियम जोड़ रहा हूं। यहाँ कुछ नमूना HTML है:लूप

<form> 
    <input name="input1" data-maxlength="5" data-minlength="3" required> 
    <input name="input2" data-maxlength="5" required> 
    <input name="input3" data-minlength="3" required> 
    <button>Submit</button> 
</form> 

मैं नियम जोड़ने के लिए यह कर रहा हूँ और यह ठीक काम कर रहा है:

$('input[data-minlength]').each(function(){ 
    if ($(this).data('minlength')) { 
     $(this).rules("add", { 
      minlength: $(this).data('minlength') 
     }); 
    } 
}); 

$('input[data-maxlength]').each(function(){ 
    if ($(this).data('maxlength')) { 
     $(this).rules("add", { 
      maxlength: $(this).data('maxlength') 
     }); 
    } 
}); 

लेकिन मैं इसे छोटा करने के लिए चाहता था, इसलिए मैं इस कोशिश की और यह काम नहीं कर रहा:

['minlength', 'maxlength'].forEach(function(item){ 
    $('input[data-'+item+']').each(function(){ 
     if ($(this).data(item)) { 
      // alert(item) shows the correct rule name 
      $(this).rules("add", { 
       // Next line fails, but hardcoding a rule name works 
       item: $(this).data(item) 
      }); 
     } 
    }); 
}); 

त्रुटि इसलिए है क्योंकि $.validator.methods[method] अपरिभाषित है। किसी भी तरह से इसे गलत विधि नाम पास हो रहा है, भले ही alert(item) मुझे बताता है कि नियम का नाम सही है।

क्या किसी के पास कोई विचार है, या एक वैकल्पिक समाधान है जिसका उपयोग मैं उपरोक्त दोहराव, कामकाजी कोड को छोटा करने के लिए कर सकता हूं?

डेमो: http://jsfiddle.net/kaVKe/1/

उत्तर

6

यह काम नहीं करता है क्योंकि आप वस्तु नामक एक नई संपत्ति के साथ एक वस्तु शब्दशः बना रहे हैं।

इस बारे में कैसे?

['minlength', 'maxlength'].forEach(function(item){ 
    $('input[data-'+item+']').each(function(){ 
     if ($(this).data(item)) { 
      // alert(item) shows the correct rule name 
      var options = {}; 
      options[item] = $(this).data(item); 

      $(this).rules("add", options); 
     } 
    }); 
}); 

यह एक विकल्प वस्तु बनाता है और आपको आवश्यक उचित संपत्ति जोड़ता है।

+0

+1 इसके लिए केवल सेकंड थे ...;) – Yoshi

+0

धन्यवाद, मुझे पता था कि यह कुछ बुनियादी था। जावास्क्रिप्ट मेरा मजबूत बिंदु नहीं है, मैं त्वरित स्पष्टीकरण की सराहना करता हूं। –

3

क्यों आप बस ऐसा नहीं करते हैं

$('input').each(function(){ 
    var max = $(this).data('maxlength'); 
    var min = $(this).data('minlength') 
    if (min) { 
     $(this).rules("add", { 
      minlength: min 
     }); 
    } 
    if (max) { 
     $(this).rules("add", { 
      maxlength: max 
     }); 
    } 
}); 

बेला यहाँ http://jsfiddle.net/kaVKe/2/ आपका कोड मुझे लगता है कि क्योंकि आप एक संपत्ति नाम

के लिए एक चर का उपयोग नहीं कर काम नहीं करता है
// Next line fails, item is always interpreted as item, not as maxlength/minlength 
item: $(this).data(item) 
+0

वैकल्पिक हल के लिए धन्यवाद। प्रत्येक इनपुट के माध्यम से लूपिंग नहीं करेगा चाहे उसके पास विशेषता हो या अब एक और विशिष्ट चयनकर्ता का उपयोग करने से बहुत धीमी हो? मुझे लगता है कि मैं इसका परीक्षण करूँगा और देखूंगा। –

+0

@Madmartigan जो इनपुट की संख्या पर निर्भर करता है, यह निश्चित रूप से हो सकता है, लेकिन विशेषता द्वारा फ़िल्टरिंग इनपुट का चयन करना तेज़ नहीं है ... जब आप इनपुट में से कम से कम एक विशेषता को फ़िल्टर करते हैं और फ़िल्टर करते हैं तो आप क्लास सर्वर पक्ष जोड़ सकते हैं कक्षा –

+0

का उपयोग करके इनपुट मैंने एक और जवाब स्वीकार किया है क्योंकि मुझे लगता है कि यह मेरी गलती को और अधिक स्पष्ट रूप से हाइलाइट करता है, लेकिन यह वास्तव में मैं उपयोग कर सकता हूं, क्योंकि मेरे पास कुछ अन्य 'डेटा-नियम हैं जिनके लिए थोड़ा उत्सुकता है इसलिए मैं अंततः करता हूं अधिक इनपुट के माध्यम से चक्र की जरूरत है। बस एक बार ऐसा कर सकते हैं। बहुत बहुत धन्यवाद। –

5

प्रयास करें:

['minlength', 'maxlength'].forEach(function(item){ 
    $('input[data-'+item+']').each(function(){ 
     if ($(this).data(item)) { 
      var rule = {}; 
      rule[item] = $(this).data(item); 
      $(this).rules("add", rule); 
     } 
    }); 
}); 

आपका समाधान क्योंकि वस्तु शाब्दिक अंकन में काम नहीं करता है, संपत्ति के नाम चर के रूप में व्याख्या नहीं की जाएगी:

{ 
    item: ... // <-- this one 
} 
+1

महान दिमाग एक जैसे सोचते हैं! – BNL

+0

महान काम करता है, धन्यवाद। मुझे पता था कि यह कुछ प्राथमिक जावास्क्रिप्ट था जो मेरी समस्या थी। –