2012-12-25 47 views
1

我是jquery的新手,陷入了一个问题,需要专家的帮助。如何通过在循环外声明一个循环来调用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 什么可以解决这个问题。任何帮助将不胜感激 谢谢

+0

你想用这段代码实现什么? – SergeyS

+0

什么是'node'? '$ .grep'将返回一个数组,所以它永远不会等于零。帮助理解代码的目标 – charlietfl

+0

您可以使用jQuery的'$ .each'来解决此警告。 – elclanrs

回答

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*/ 
    }  
} 
+0

非常感谢您的回复,但问题是我的html元素可能被隐藏这是它的父母可能需要显示:无 –

+0

OK ..容易被添加'检查:visible'选择。如果不是试图修补你的代码,而是让你完全解释你正在尝试做什么,那真的会有所帮助。可以写'if($('#'+ list [val] .Id).is(':visible'))'例如。你需要的解决方案是非常直接的...只是不知道你需要什么 – charlietfl

+0

非常感谢。如何使用可见的选择器进行检查,请您稍后解释一下。当然我会保留你的想法:) –

2

当你写Visible(e)你调用函数可见与参数e。这不是你想要的。你想给这个函数本身.grep()。因此,请尝试修复它:

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

很多感谢您的答复 –

0

您必须将函数传递给$.grep。但Visible(e, list, val)正试图呼叫该函数并将返回值传递到$.grep(这是truefalse)。那一刻,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'); 
}); 
+0

非常感谢。我得到了我们的观点 –

+0

用新信息更新了我的答案。 –

+0

非常感谢@Felix。我会尝试您的解决方案 –

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功能等任务。它会帮助你。

+0

非常感谢@SergeyS –