【问题标题】:How to call a jquery function inside a loop by declaring it outside the loop如何通过在循环外声明它来调用循环内的jquery函数
【发布时间】:2012-12-11 14:05:27
【问题描述】:

我是 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=create one 我正在通过 result === 0 检查它 什么可以解决这个问题。任何帮助将不胜感激 谢谢

【问题讨论】:

  • 你想用这段代码实现什么?
  • 什么是node$.grep 将返回一个数组,因此它永远不会等于零。帮助理解代码的目标
  • 你可以使用 jQuery 的 $.each 来解决这个警告。
  • 节点基本上是一些html元素数组
  • 好吧,我正在做的是我发现 hmlt 元素 elreay 是否存在。节点包含 html 元素,我正在将列表中的 id 与所有节点元素 id 进行一一比较

标签: jquery jslint


【解决方案1】:

你根本不需要 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 函数来完成这些任务。它会帮助你。

【讨论】:

    【解决方案2】:

    你必须将一个函数传递给$.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');
    });
    

    【讨论】:

      【解决方案3】:

      一个更简单的方法是简单地创建一个 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*/
           }       
       }
      

      【讨论】:

      • 非常感谢您的回复,但问题是我的 html 元素可能被隐藏,它的父元素可能有显示:无
      • OK.. 通过添加:visible 选择器轻松检查。如果您不尝试修补您的代码,而是对您正在尝试做的事情给出完整的解释,那将真的很有帮助。例如可以写if( $('#'+list[val].Id).is(':visible'))。您需要的解决方案非常简单……只是不确定您需要什么
      • 非常感谢。如何使用可见选择器检查它,你能解释一下吗?当然,我会牢记你的这一点:)
      • $('#'+list[val].Id).is(':visible')) 那么这个语句会检查可见和隐藏吗?
      • 无法解释我不明白的...你应该从提供目标的全部细节开始...忘记node并从头开始解释
      【解决方案4】:

      当您编写Visible(e) 时,您调用带有参数e 的可见函数。这不是你想要的。您想将函数本身提供给.grep()。所以尝试像这样修复它:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        • 2014-06-15
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多