查找集合中是否有任何元素具有style.display!==“none”;

时间:2013-06-27 20:06:57

标签: javascript jquery

var isAnyBool = $(selector)
 .filter(function(){ return this.style.display !== "none"; })
 .length;

// if (isAnyBool) { .. }

这可以按预期工作,但当需要的所有元素都是简单的真/假时,不必要地计算所有元素。如何才能提高效率?

更新:,因为visible不知道元素是否被直接隐藏,或者某些父母实际上是隐藏的,我必须检查style.display或者相同的内容功能

6 个答案:

答案 0 :(得分:6)

我不了解性能效率,但这更容易理解:

var isAnyBool = $(selector).is(':visible');

编辑#2:

我认为@dandavis's answer是最好的

答案 1 :(得分:2)

您可以使用:visible

简化
var isAnyBool = $(selector).filter(':visible').length;

答案 2 :(得分:2)

var isAnyBool =  $(selector+"[style*='display: none']").length > 0 ;
在现代浏览器中,

应该比任何类型的迭代都快。

因为jQuery的:visible不仅仅受到style.display的影响,它还不适合这项工作。

仅检查样式属性,并且在没有js迭代的情况下进行检查,使其成为撰写本文时提供的最快,最简单的解决方案。

答案 3 :(得分:2)

您可以使用.is() method使用相同的回调,而不是过滤和计算元素:

var isAnyBool = $(selector).is(function(){ return this.style.display !== "none"; })

答案 4 :(得分:1)

它不计算.. length是属性而不是函数。因此,当您致电.length

时,没有太多事情发生

如果可以在其他地方使用,我会存储结果,而不是存储长度。

var mySelector = $(selector).filter(function(){ return this.style.display !== "none"; })

if (mySelector.length) { .. }

答案 5 :(得分:1)

不能确定这是否是或多或少的开销,但如果你这样做的话,对我来说似乎更清晰:

$(selectSomeStuff).filter(!$(this).is(':visible'));

...或可测试变量

var isAnyBool = $(selectSomeStuff).filter(!$(this).is(':visible')).length

......也许就像声明一样

if ($(selectSomeStuff).filter(!$(this).is(':visible'))){
  var isAnyBool = true;
  // OR
  //.. do stuff here ...
}