如何通过在循环外声明它来调用循环内的jquery函数

时间:2012-12-25 19:24:31

标签: jquery jslint

我是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不存在那么我r =创建一个我正在通过结果=== 0 来检查它   什么可以解决这个问题。任何帮助将不胜感激 谢谢

4 个答案:

答案 0 :(得分:2)

当您编写Visible(e)时,您可以使用参数e调用函数。这不是你想要的。您希望将函数本身赋予.grep()。所以尝试修复它:

var result = $.grep(node, Visible);

答案 1 :(得分:0)

您必须将功能传递给$.grep。但Visible(e, list, val)正在尝试调用该函数并将返回值传递给$.greptruefalse)。那时,e尚未定义(它是$.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');
});

答案 2 :(得分: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*/
     }       
 }

答案 3 :(得分:0)

根本不需要jQuery。只需使用两个循环,并检查您想要的内容:

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函数来完成这些任务。它会对你有所帮助。