2013-06-27 82 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基準 –

相關問題