2012-01-25 49 views
6

我使用jQuery validation插件試圖根據data-屬性添加規則。我將根據data-minlengthdata-maxlength添加最小/最大長度規則。下面是一些示例HTML:基於循環中的數據屬性添加jQuery驗證規則

<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

它不起作用,因爲您正在創建一個名爲item的新屬性的對象文字。

這個怎麼樣?

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

謝謝,我知道這是基本的東西。 Javascript不是我的強項,我很欣賞快速解釋。 –

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

很好,謝謝。我知道這是一些基本的JavaScript,這是我的問題。 –