在每次迭代中获取元素。

时间:2013-07-30 22:37:26

标签: javascript jquery

我有一个列表,可能会也可能不会显示在屏幕上。我现在要做的是检查该列表中的所有li是否可见。如果li确实可见,那么我希望迭代停止然后获得该特定元素。

我的尝试: -

var getList = $("ul li").each(function(){
                                    return $(this).is(":visible") ? false: true; 
                                    });

从我的理解上面的代码是什么,它从“ul li”选择器获取数组,并使用函数迭代。每当我注意到元素是可见的时,我就需要打破迭代,因此返回false以退出循环。

所以,现在问题是我不知道如何获得该元素。我已经到了可以停留在想要的元素并且卡在那里的地方。

3 个答案:

答案 0 :(得分:6)

你可以这样做:

var $firstVisible = $('ul li:visible').first();

答案 1 :(得分:2)

编辑 - 做@elclanrs针对此特定问题的回答;下面是什么,当你不能用一个聪明的内置选择器技巧。

<小时/> 您可以将回调设置为变量:

var visibleOne;
$("ul li").each(function(){
  if ($(this).is(':visible')) {
    visibleOne = this; // or $(this) if you prefer
    return false;
  }
});

如果您不喜欢凌乱的局部变量,可以将整个内容包装为jQuery插件:

$.fn.findVisible = function() {
  var rv;

  this.each(function() {
    if ($(this).is(':visible')) {
      rv = $(this);
      return false;
    }
  });

  return rv;
};

然后:

var visibleOne = $('ul li').findVisible(); // either undefined or a new jQuery object

答案 2 :(得分:2)

$.is()返回一个布尔值,所以:

return $(this).is(":visible") ? false: true;是不必要的。

如果您想要返回元素,请按以下方式形成条件:

$("ul li").each(function(){
  if($(this).is(":visible")) {
    return $(this);
  } 
});

在这里使用return将打破循环。使用循环来抽象匹配的结果是常见的做法:

var matched = [];

$("ul li").each(function(){
  if($(this).is(":visible")) {
    matched.push($(this))
  } 
});

这会将每个:visible元素添加到匹配的数组中,该数组现在可用于您需要的任何内容:)

编辑 -

我错过了你的上一行:“如果li确实可见,那么我希望迭代停止,然后获得该特定元素。”这意味着这意味着使用$.first()的答案非常可靠。