1

次の javascript と jquery コードには 2 つの問題があります。jqueryの各ループは1回だけ反復し、正しいIDを持つ最初の要素を取得して、必要なことを実行して停止します。

2番目の問題は、各関数内のコードでelseを使用すると、次のifさえ試行せず、そこで終了することです。私はおそらく何か根本的な間違いを犯していますが、jquery の各関数と、else に期待することから、それはわかりません。

Javascript コード:

var $checkVal;
var $checkFailed;

$("#compliance").live("keypress", function (e) {

 if (e.which == 10 || e.which == 13) {
    var checkID = $(this).parents('td').next().attr('id');
    var checkVal = $(this).val();
    $('#' + checkID).each(function () {
        var cellVal = $(this).text();
        if (checkVal == cellVal) {
            $(this).removeClass("compFail").addClass("compOk");
        } else {
            $(this).removeClass("compOk").addClass("compFail");
            var checkFailed = True;
        }
    });
    if (checkFailed == 'True') {
        (this).addClass("compFail");
    } else {
        (this).addClass("compOk");
    }
 }
});

変数 checkID に割り当てられた ID を使用して、各要素のすべてのインスタンスを反復する each ループを取得し、else の後にコードを続行して、最後の if を実行するにはどうすればよいでしょうか?

4

3 に答える 3

4

idは 1 ページに1 回だけ表示する必要があります。同じ ID を持つ複数の要素が必要な場合は、classではなくを使用しidます。

ページ内の要素を 1 つだけeach選択しているため、ループ iter は 1 回だけです。id要素を aclassに変更すると、期待どおりに機能するはずです。

于 2013-03-12T12:34:10.890 に答える
1

jqueryの各ループは1回だけ反復し、正しいIDを持つ最初の要素を取得して、必要なことを実行して停止します。

はい、これはあなたが使用しているコードに完全に適しています:

$('#' + checkID).each(function(){};)

ID 属性は一意です。DOM には、特定の ID を持つ要素が 1 つだけ存在する必要があります。セレクターは 1 つの要素のみに一致できます。アイテムを 1 つだけ含むコレクションを繰り返し処理しています。

于 2013-03-12T12:34:24.503 に答える
1

これは、間違った var を削除しないように、コメントで話していることを説明するためのものです。

var checkVal;
var checkFailed;

$("#compliance").live("keypress", function (e) {

 if (e.which == 10 || e.which == 13) {
    var checkID = $(this).parents('td').next().attr('id');
    //HERE is the first edit
    checkVal = $(this).val();
    $('#' + checkID).each(function () {
        var cellVal = $(this).text();
        if (checkVal == cellVal) {
            $(this).removeClass("compFail").addClass("compOk");
        } else {
            $(this).removeClass("compOk").addClass("compFail");
            //HERE is the second
            checkFailed = True;
        }
    });
    if (checkFailed == 'True') {
        (this).addClass("compFail");
    } else {
        (this).addClass("compOk");
    }
 }
});

通常、変数を再宣言すると、(C# のような型付き言語で) コンパイル時エラーが発生します。ここでは、それがローカル変数として使用されるか (グローバル変数を無視して)、JavaScript がそれらを組み合わせて同じものと見なすかは明確ではありません。いずれにせよ、あなたの意図がより明確になるように、私が示したようにそれを使用する必要があります.

編集: jsFiddle で問題が発生していたため、変数 (var $checkVal) から $ を削除しました。したがって、これらの $ が不要な場合は削除してください。また、jsFiddle でのテストでは、コードを変更する必要がないことが示されていることに注意してください (宣言から $ を削除する可能性がある以外は)。

于 2013-03-12T13:36:08.230 に答える