2012-01-25 6 views
6

属性に基づいてルールを追加しようとしているjQuery validationプラグインを使用しています。私はdata-minlengthまたはdata-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

ありがとう:あなたのソリューションがあるため、オブジェクトリテラル表記では動作しません

['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); } }); }); 

、プロパティ名は、変数として解釈されることはありません。属性を持つかどうかにかかわらず、すべての入力をループしないか、より特定のセレクタを使用するよりもはるかに遅くなるでしょうか?私はそれを試してみると思う。 –

+0

@Madmartiganは入力の数に依存しますが、確かにそうかもしれませんが、属性によるフィルタリングの入力はそれほど高速ではありません...クラスサーバー側を追加することができます。クラス –

+0

を使用して入力私は間違いをより明確に強調していると思うので別の答えを出しましたが、これは実際には私が使っているものかもしれません。より多くの入力を繰り返す必要があります。一度やりましょう。どうもありがとう。 –

5

試してみてください。この問題を回避するための

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

偉大な心は同じように考える! – BNL

+0

素晴らしい、ありがとう。私はそれが私の問題だったいくつかの初心者のjavascriptであることを知っていた。 –

関連する問題