2011-06-23 120 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。 –