2011-06-23 157 views
0

我有下面的代碼:需要幫助/車削for循環if語句到jQuery選擇

var $elements = $("body").find("*"); 

for (var i = 0, len = $elements.length; i < len; i++) { 
    var $e = $elements.eq(i), 
     cssFloat = $e.css("float"), 
     cssDisplay = $e.css("display"); 

    if (cssDisplay !== "none" && 
     (cssFloat === "left" || cssFloat === "right")) { 

     $e.css("display", "inline"); 

    } 

}; 

出於性能方面的原因,我想換成for循環,如果用jQuery選擇語句將所有元素過濾掉只有那些需要應用display: inline;的元素。

我在想沿着以下僞代碼的東西線:

$("body") 

.find("*") 
.not(selector for elements whose css display style is not "none") 
.contains(selector for elements whose css float style is "left" or "right")  
.css("display", "inline"); 

不管出於什麼原因,我的大腦失敗我。這可能嗎?

+0

沒有任何可以查詢元素樣式屬性的jQuery選擇器。 – BoltClock

+0

你真的想在這裏解決什麼問題?我感覺無論如何,還有更好的辦法。 – thirtydot

+0

首先,'float:left'(或'right')強制'display:block'。 – thirtydot

回答

2

你可以使用$.filter()方法來得到你想要的東西:

$(":visible").filter(function(index){ 
    return ($.inArray($(this).css('float'), ['left','right']) > -1); 
    }).css({display:'inline'}); 

這會導致浮動元素正在變成內聯元素。

演示http://jsbin.com/utape3/edit

雖然jQuery的文檔states會有用:visible性能問題,它比使用*body *更有效。

性能比較http://jsperf.com/splat-vs-pseudo

我不知道用JavaScript這樣做的更快的方法。

$.expr[':'].floated = function(obj) { 
    return ($.inArray($(obj).css('float'), ['left', 'right']) > -1); 
}; 

$(":floated").css({display:'inline'}); 

我真的只在該方法中,不是完全熟悉內部如何處理這種類型的選擇的結果部分感興趣的是:你會在我以前的一切,包括自定義選擇性能測試預告。

原始的JavaScript - 更快

我已經加入到了性能測試如下:

var els = document.getElementsByTagName('*'); 
for (var i = 0; i < els.length; i++) { 
    cssTxt = els[i].style.cssText; 
    if ((cssTxt.indexOf('float: left') > -1) || (cssTxt.indexOf('float: right') > -1)) { 
    els[i].style.display = 'inline'; 
    } 
} 

該測試假定:

<p style="float:left">Foo</p> 
<p style="float:right">Bar</p> 

這被扔在一起,但與以前的jQuery方法相比,可笑的速度很快。

+0

但是這對性能沒有太大的幫助 - 它只是更好的功能代碼:) – hobbs

+0

'.children()'只會選擇直接的孩子。他畢竟是後代。 – thirtydot

+0

對於它的價值,他實際上並不想刪除'float'屬性。他試圖用JavaScript來解決某些(瘋狂)原因:http://www.positioniseverything.net/explorer/doubled-margin.html – thirtydot

2

這似乎是一個非常糟糕的主意。但是,這裏的jQuery完成你所要求的大致內容。這不會有太大幫助,因爲它仍然需要查看頁面上的所有內容:

$(":visible").filter(function(){ 
    var cssFloat = $(this).css("float"); 

    return cssFloat === "left" || cssFloat === "right"; 
}).css("display", "inline"); 
+0

這就是我原本的,但是我發現['.filter()'](http://api.jquery.com)實際上比我當前的方法慢。仍然+1。 –