1

私は jquery を初めて使用し、問題が発生しており、専門家の助けが必要です。

ここに私のコードがあります

 for (val in list) {
    var result = $.grep(node, function(e){
          return e.id === list[val].Id;
    });
    if (result === 0)
     // do something
}

JSLint を渡そうとすると、このエラーが発生しました

#1 Don't make functions within a loop.

私はjquery grep関数で関数を作成しているという問題を知っていますが、関数をループの外に移動して変数に割り当ててから呼び出す方法に行き詰まっています。私の関数は引数eを話しているので。私はこのようにそれを試しました

var Visible = function (e, list, val) {return e.id === list[val].Id;}; 

for (val in list) {
   var result = $.grep(node, Visible(e, list, val));
}

しかし、今jslintはエラーを出しています

 #1 'e' was used before it was defined.
    var result = $.grep(node, Visible(e)); // Line 125, Pos 69

//------------------------------------------------ --------------------

ここにデータがあります

node: Array[5]
  0: HTMLTableRowElement
  1: HTMLTableRowElement 
  2: HTMLTableRowElement
  3: HTMLTableRowElement

list: Array[5]
  0: Object
    0: "cc"
    1: "ss"
    Id: "000"
  1: Object
  2: Object

今、リストのどの要素にhtml要素が存在するかを見つけています。リスト内の要素と htmlelement が存在しない場合、ir=create one で結果 === 0によってチェックして います。この問題の解決策は何ですか。どんな助けでも感謝します

4

4 に答える 4

2

あなたが書くとき、あなたVisible(e)は引数で可視関数を呼び出しますe。これはあなたが望むものではありません。関数自体を に渡します.grep()。したがって、次のように修正してみてください。

var result = $.grep(node, Visible);
于 2012-12-25T19:30:45.613 に答える
0

はるかに簡単なアプローチは、IDセレクターを作成し、それが存在するかどうかを確認することです。

for (val in list) {    
    if( $('#'+list[val].Id).length){
        /* element exists in page*/
    }       
}

node要素のコレクションとして内部を調べるには、filter()メソッドのみを使用できます

var $node=$(node);
for (val in list) {    
     if( $node.filter('#'+list[val].Id).length){
            /* element exists in node*/
     }       
 }
于 2012-12-25T19:37:49.563 に答える
0

に関数を渡す必要があります$.grep。しかし、関数を呼び出そVisible(e, list, val)うとし、戻り値を( または のいずれか) に渡します。その時点では、まだ定義されていません (コールバックに渡されるはずの引数です)。$.greptruefalsee$.grep

代わりに、比較を行う関数を返す関数を作成する必要があります。

function createCallback(id) {
    return function(e) {
        return e.id === id}; 
    };
}

for (val in list) {
   var result = $.grep(node, createCallback(list[val].Id));
}

つまり、ループ内で関数を作成することは、それらの関数がループの次の繰り返しの前に呼び出される限り問題ありませんが、JSLint は非常にうるさいです。


より良い解決策は、要素が既に存在する配列からすべての要素を削除することです。

$.map(list, function() {
    return $('#' + this.Id).length === 1 ? null : this;
}).each(function() {
    // create and append element here
    // e.g.
    $('<div />', {id: this.Id}).appendTo('#container');
});
于 2012-12-25T19:31:10.963 に答える
0

これにはjQueryはまったく必要ありません。2 つのループを使用して、必要なものを確認してください。

for (var i=0; i<list.length; i++) {
    var found = false;    
    for (var j=0; j<node.length; j++) {    
        if(list[i].id == node[j].Id) {
            // We have found such element in node!
            found = true;
            break; 
        }
    }     
    if(!found) {
        // we did not find such element in node
    }
}

基本的な Javascript ループがどのように機能するかを理解してから、そのようなタスクに jQuery 関数を使用することをお勧めします。それはあなたを助けるでしょう。

于 2012-12-25T20:20:21.113 に答える