2013-06-27 61 views
0
var isAnyBool = $(selector) 
.filter(function(){ return this.style.display !== "none"; }) 
.length; 

// if (isAnyBool) { .. } 

按预期工作,但在需要的所有元素都是简单的真/假时不必要地计算所有元素。如何改进以提高效率?查找集合中是否有任何元素有style.display!==“none”;

UPDATE:因为visible不知道,如果元件直接隐藏,或者有些家长实际上是隐藏的,我要检查style.display或东西在功能

+1

'$( '*')过滤器( ':隐藏')length'? – PlantTheIdea

+0

@PlantTheIdea检查更新部分 –

+0

一些基准测试,http://jsperf.com/test-display/3 –

回答

2
var isAnyBool = $(selector+"[style*='display: none']").length > 0 ; 

在现代浏览器中的速度要比任何类型的迭代快得多。

因为jQuery's:visible可能不仅仅受style.display影响,它不是这个工作的正确工具。

这只检查样式属性,没有js迭代就这样做,使它成为写作时提供的最快最简单的解决方案。

+0

不需要在这里比较它0.什么不是风格设置内联? –

+0

好吧,它应该是一个布尔值... – dandavis

+0

0 == false,所有其他结果将被解释为true –

1

等于它不指望.. length是属性不是功能。所以当你打电话时没有太多的事情发生,所以当你打电话给.length

而不是存储长度,我会存储结果,以防万一它可以用在其他地方。

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

if (mySelector.length) { .. } 
+0

当然,构建arrayList并获取它的长度是* counting *? – Bergi

+0

这与OP的方法相同。 –

+1

这似乎更多的是一个切线问题的语义 – landons

6

我不知道性能效率,但是这是更容易阅读:

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

编辑#2:

我觉得@dandavis's answer是最好的一个

+2

我想如果有是隐藏的父元素,那么所有的孩子都看不见你的方法,我不希望这 –

+0

@mpapec好点! –

+1

@mpapec如果你手动检查'style.display',情况如何? – landons

2

你可以用它简单:visible

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

不能肯定地说,如果这是更多或更少的开销,但如果你做了这样的事情似乎更清晰的对我说:

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

...或检验的变量

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

...也许if语句

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

而是过滤和计数的元素,你可以用相同的回调使用.is() method

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

看起来不错,所以'is()'不是遍历所有元素? –

+0

@mpapec我很确定它会 –

+0

@roasted tnx,我会做一些jsperf基准 –

相关问题