2017-01-27 1 views
0

私は "ダイナミック"カスケードドロップボックスを作成しようとしています。しかし、<select>フィールドIDを含む配列内のすべての変数に、.change()リスナーを追加するという問題が発生しています。js Array()のすべての変数に.change()を追加します。

私が使用するのであれば:

fields[0].change(function() {populateFields(1, 0, xml);}); 
fields[1].change(function() {populateFields(2, 1, xml);}); 

コードは完璧に動作します。現在のコードでは、3つの分野に限られているので、私は、フィールドの可変数を持つことができるように

for (i=1; i<numberOfFields; i++){ 
      p = i-1; current = i; 
      fields[p].change(function() {populateFields(current, p, xml);}); 
     } 

:しかし、私はこのようなものを使用することを好むだろう。 forループは現在動作していますが、2番目のフィールドが入力されても機能しません。

ご協力いただければ幸いです。

注:これは変数や変数を関数に渡すのではなく、イベントリスナーを配列に追加することについての質問です。印がついた答えが正解でした。

+0

を1のループは、0インデックスが異なるプログラミングを持ち、他の場所で処理されるためです。これはfields [1] = model、fields [2] = year – Blaise

+0

の場合はインデックス1と2のためだけですか? – hackerrdave

+0

i = 1で始めると 'if'条件は決してヒットせず、そのためには必要ありません – hackerrdave

答えて

1

あなたはArray.prototype.forEach()を使用することができますし、あなたがあなたに渡す機能であなたが最初の要素処理している場合のガードを置くことができます:私は、理由は私がのために始めていますことを言及する必要があります

fields.forEach(attachChangeHandler); 

function attachChangeHandler(field, i) { 
    if (i === 0) { return; } 
    field.change(function() { 
    populateFields(i + 1, i, xml); 
    }); 
} 
+0

これは本当に有望ですね。 attachChangeHandler関数のフィールドはどのように定義されていますか? – Blaise

+1

@Blaisen 'forEach'は配列内の各要素の関数を呼び出し、パラメータを渡します。重複した質問にはより多くの情報があります。 – 4castle

+0

'forEach'に渡される関数は、array、index、arrayの要素に対してargsを持ちます。この場合、フィールドは配列内の各反復要素を表します – hackerrdave

関連する問題