0

私のフォームでは、サーバーからロードされた後に変更された値を確認するだけです。そのために私はこの機能をやっています:

$(checkBox).each(function(i,el){
            status.push($(el).prop("checked"));

            $(el).click(function(){
                var clickedIndex = checkBox.index($(this));
                var prevStatus = status[clickedIndex];

                if(prevStatus !== $(this).prop("checked")){
                    statusChanged.push($(this).val() + ( $(this).prop("checked") ? add.toLowerCase() : remove.toLowerCase()));
                }else{
                    var that = $(this);
                    statusChanged = $.grep(statusChanged, function(value) {
                        return value != that.val() + add.toLowerCase()
                    });

                    statusChanged = $.grep(statusChanged, function(value) {
                        return value != that.val() + remove.toLowerCase()
                    });
                }

                console.log(statusChanged);

            })

        })

この関数では、else 部分 (statusChanged) で $.grep 関数を 2 回呼び出してい"add"ます"remove"

var that = $(this);
statusChanged = $.grep(statusChanged, function(value) {
    return value != that.val() + add.toLowerCase() || that.val() + remove.toLowerCase() //not working
});

動作していません..?ここで何が問題なのか、または $,grep は or (||) 三項演算子を受け入れないか、他の短い方法を指定します.. pls

前もって感謝します。

4

3 に答える 3

1

「$,grep は or (||) 三項演算子を受け入れません」

はい、そうなります。$.grep()関数がブール値を返すことを期待していますが、ブール値を取得する方法は気にしません。

あなたの質問がvalue追加または削除されていないことを確認する方法である場合、これを行うことができます:

var that = $(this);
statusChanged = $.grep(statusChanged, function(value) {
    return value != that.val() + add.toLowerCase()
           && value != that.val() + remove.toLowerCase();
});

つまり、value追加 valueも削除でもないテストですが、他の値にすることもできます。

ただし、コールバックが呼び出されるたびに.val()andの呼び出しを行うのはちょっと厄介なように思えるので、おそらく次のようにします。.toLowerCase()

var val = $(this).val(),
    valAdd = val + add.toLowerCase(),
    valRemove = val + remove.toLowerCase();
statusChanged = $.grep(statusChanged, function(value) {
    return value != valAdd && value != valRemove;
});
于 2013-06-20T10:15:38.470 に答える
1

実際に、次のコードを実行します。

statusChanged = $.grep(statusChanged, function(value) {
    return value != that.val() + add.toLowerCase()
});

statusChanged = $.grep(statusChanged, function(value) {
    return value != that.val() + remove.toLowerCase()
});

は- 操作 ( )を実行していません。それはです。1 つの条件でリストをフィルタリングしてから、2 番目の条件で同じリストをフィルタリングすると、両方の条件でフィルタリングされます (an )。それらの1つではありません( an )。or||andandor

あなたがする必要があるのは&&、新しいコードで使用することです:

var that = $(this);
statusChanged = $.grep(statusChanged, function(value) {
    return (value != that.val() + add.toLowerCase()) && (value != that.val() + remove.toLowerCase());
});

編集:

また、言及されている他の回答のいくつかと同様に、優先順位に注意する必要があります。個々のケースを括弧で囲みます (上記で追加したように)。

于 2013-06-20T10:16:41.743 に答える
0

これは演算子の優先順位に関係していると思います。+より優先順位が高い!=。また、ロジックに問題があるため、値がどちらでもないことを確認する必要があります。

行を次のように変更してみてください。

return (value != that.val() + add.toLowerCase()) && (value != that.val() + remove.toLowerCase());

リファレンス: JavaScript 演算子の優先順位

于 2013-06-20T10:15:14.040 に答える