1

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

我的尝试:-

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

根据我对上述代码的理解,它从“ul li”选择器中获取数组并使用每个函数进行迭代。每当我注意到元素可见时,我都需要中断迭代,因此返回 false 以退出循环。

所以,现在的问题是我不知道如何取回那个元素。我已经到了可以停在想要的元素上并卡在那里的地步。

4

3 回答 3

6

你可以简单地这样做:

var $firstVisible = $('ul li:visible').first();
于 2013-07-30T22:41:13.643 回答
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()非常可靠。

于 2013-07-30T22:44:08.470 回答
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
于 2013-07-30T22:39:48.750 回答