2012-02-27 53 views
3

是否可以通過CSS屬性選擇DOM元素?通過JavaScript中的CSS屬性選擇元素

例如:

awsome_function ({'background-color' : '#0cf'}); 
// return all object, which's background-color css attribute value is '#0cf' 

awsome_function (['background-color']); 
// return all object, which has background-color css attribute 

awsome_function (['-my-special-cssattribute']) 
// return all object, which has '-my-special-cssattribute' css attribute 

我知道這是可能使用jQuery each方法選擇元素,像這樣:

$('*').each(function(){ 
    if($(this).css('-my-special-cssattribute')) { 
     /* do something */ 
    } 
}) 

但是它也許慢,unelegant。有沒有更酷的方法來做到這一點?

回答

4

我會使用自定義選擇:

$.extend($.expr[":"], { 
    foo: function (e) { 
     return $(e).css('background-color') == '#0cf'; 
    } 
}); 

用法:

alert($('div:foo').size()); //get the count of all the divs that matches the selector 
+0

我喜歡它。有什麼辦法可以參數化'foo'嗎? forexample $('div:foo(「background-color」,「#0cf」)') – 2012-02-27 12:07:33

+1

@NagyMárton我建議在函數內部保留這種邏輯,以返回你需要的元素。如果你想添加更多條件,請使用'&&' – Johan 2012-02-27 12:22:55

+0

非常感謝! – 2012-02-27 12:26:12

0

我的建議是追加不同的背景顏色的類。然後你可以選擇那些。

或者你可以嘗試的CSS() http://api.jquery.com/css/

+0

THX的答案,但我想使用某種過濾速度快的,對於全球后備庫。例如,我添加了一個-spec-border-radius css屬性,它調用了一個在任何瀏覽器中爲該對象添加圓角的方法。 – 2012-02-27 11:39:36

+0

我不認爲這樣做是一個很好的解決方案。 Mozilla,Webkit和IE9 +具有邊界半徑,如果你想要它的IE 8,你將不得不使用圖像。 – bytecode77 2012-02-27 11:47:26

1

但是它也許慢,unelegant。有沒有更酷的方法來做到這一點?

這很慢。這是不雅的。不要這樣做。用一個ID或最終選擇你的元素與類,但從來沒有這樣。認真。

+0

應該明確指出,按類和/或CSS屬性選擇將使jQuery解析整個DOM樹。 (在大多數瀏覽器中)所有JS實現都支持的唯一的* direct *(means:fast)選擇器是ID選擇器。 – Kaii 2012-02-27 11:35:22

+0

這就是爲什麼「最終」是斜體:-)。但對於他的情況,按班級選擇所有元素將是一個好主意(假設班級添加了背景)。 – 2012-02-27 11:37:55

+0

我同意你的意見,但它不回答這個問題。 – hooleyhoop 2012-02-27 11:51:49

-1

答:沒有辦法做到這一點,並有很好的理由。 它會很慢,而且當然比不好看。 Personnaly,如果我有一天看到我的一個開發人員那麼做,我會殺了他,並且/或者讓我的老闆立即取代他。

使用類或多個bettern id!如果你不能,問題來自你的應用程序結構邏輯。

相關問題