0

フォーム内の依存フィールドを反復処理する for ループがあります。配列は次のようになります。

var dependentFields = [
    { parent: FLDID_LABEL, children: [FLDID_LABEL_TEMPLATE, FLDID_LABEL_INSTRUCTIONS], choiceTrigger: 'Yes', markAsReq: true },
    { parent: FLDID_SHIP_TO, children: [FLDID_SHIP_TO_ADDR], choiceTrigger: 'No', markAsReq: true }
];

すべてのイベント ハンドラーをアタッチするために呼び出される関数があります。簡単にするために、問題が発生しているループだけを示します。

function attachEventHandlers() {
    // begin dependent fields
    for (var i = 0; i < dependentFields.length; i++) {
        var o = dependentFields[i];
        $('#' + o.parent).change(function () {
            var visible = $('#' + o.parent + ' :selected').text() === o.choiceTrigger;
            for (var c = 0; c < o.children.length; c++) {
                var child = o.children[c];
                showField(child, visible);
                if (o.markAsReq && $('#' + child).val() === '') {
                    MarkFieldAsRequired(child);
                }
            }
        });
    }
}

2 番目の従属フィールドのみが機能し、最初のフィールドは機能しません。var iこれは方法に関係があるかvar o、外部関数から参照されていると思います。事実上、同じイベント ハンドラーがすべての依存フィールドに関連付けられます。どうすればこれを修正できますか?

編集: ここにバグのある jsfiddle があります: http://jsfiddle.net/H3Bv2/4/ 親のいずれかを変更すると、2 番目の子にのみ影響することに注意してください。

4

2 に答える 2

1

ここで解決策を見てみましょう:ループ内の JavaScript クロージャー – シンプルな実用例.

元のコードはo、ループで作成されたすべてのコールバック関数で単一の変数を参照します。その変数の値は反復ごとに再割り当てされるため、すべてのコールバックは最後に割り当てられた値を使用することになります。

于 2012-10-12T22:12:33.753 に答える
0

私はそれを考え出した。let meを使用jQuery.eachすると、ループ内で変数を定義することを回避できます。これが私の解決策です:

function attachEventHandlers() {
    // begin dependent fields
    $.each(dependentFields, function (i, o) {
        $('#' + o.parent).change(function () {
            var visible = $(':selected', this).text() === o.choiceTrigger;
            for (var c = 0; c < o.children.length; c++) {
                var child = o.children[c];
                showField(child, visible);
                if (o.markAsReq && $('#' + child).val() === '') {
                    MarkFieldAsRequired(child);
                }
            }
        });
    });
}
于 2012-10-12T21:59:14.540 に答える