2009-10-26 74 views
15

如果我要选择每一个形象,它的Alt是家庭例如,我可以做这样的事情:jQuery中有样式选择器吗?

$("img[alt='Home']") 

但我怎么能在一个单一的选择每一个元素,他们的width CSS属性是750px例如选择?

编辑:如果没有这样的选择器,是否有任何插件,或任何计划在接下来的jQuery版本中做?

+0

没有这样的选择器 – 2009-10-26 14:27:40

回答

17

不一定是好主意,但你可以为它添加一个新的灒选择:

$.expr[':'].width = function(elem, pos, match) { 
    return $(elem).width() == parseInt(match[3]); 
} 

然后你可以使用像这样:

$('div:width(970)') 

这将是惊人,慢但是,所以你想缩小你正在比较的元素的数量,例如:

$('#navbar>div:width(970)') 

只能选择那些直径为navbar的后代,也有970px的宽度。

+1

'$ .expr'是jQuery中正确的API吗?我刚刚使用了'jQuery.find.selectors.filters',因为那是Sizzle暴露于全局范围的地方。 – eyelidlessness 2009-10-26 17:02:16

+0

删除我的答案,因为它或多或少重复你的答案。但仍然不清楚API。 – eyelidlessness 2009-10-26 17:04:47

+1

啊。他们评估的是同一个对象,但jQuery.find.selectors.filters看起来不那么傻。感谢您指出这一点 – 2009-10-26 18:32:14

15
var $images = $("img").filter(function() { 
    return $(this).css('width') == '750px'; 
}); 

编辑:没有插件我知道,或任何计划,包括这样的特定功能。您可以轻松地自己pluginify它,如(未经测试):

$.fn.filterByWidth = function(width) { 
    var $images = $("img").filter(function() { 
     return $(this).css('width') == width; 
    }); 
    return $images; 
}; 

用法:

$images = $('#div img').filterByWidth('750px'); 
$images = $('#div img').filterByWidth('50%'); 
...etc... 
+1

这不可能用一个简单的选择器吗? – 2009-10-26 14:26:44

+0

应该使用'width()'而不是 – 2009-10-26 14:27:09

+0

@Alon - 我严重怀疑它 – karim79 2009-10-26 14:27:24

5

我不知道这是否会工作,但...:

${"[style*=width: 750px]") 

但是,使用类控制宽度,然后修改该类的所有实例的宽度...或更改为其他类可能会更好:

$(".classname").removeClass("classname").addClass("otherclassname"); 
+0

@R。 Bemrose--我认为这会在我看到你的帖子的时候起作用,但我在几种情况下尝试过,没有任何运气。我相信你可以在Prototype中做类似的事情,这太糟糕了,你不能用jQuery。 – karim79 2009-10-26 14:47:02

1

这是一个古老的一个,但由于乔纳森·德尔斯特罗瑟的答案,这让我思考如何圆了这一点,多一点:

(function($){ 

    // Add commonly used regex to the jQuery object 
    var regex = { 
     digits: /^(-?\d+(?:\.\d+)?)([a-zA-Z]+)?$/ 
     ,expr: /^([\w-]+)\s*([:=<>])\s*([\w-\.]+(?:\([^\)]+\))?)$/ 
    }; 

    // Create a custom jQuery function that allows a bit more useful CSS extraction 
    $.fn.extend({ 
     cssExtract: function(cssAttr) { 

      var val = {prop:this.css(cssAttr)}; 

      if (typeof val.prop === "string") { 
       var match = regex.digits.exec(val.prop); 
       if (match) { 
        val.int = Number(match[1]); 
        val.metric = match[2] || "px" 
       } 
      } 

      return val; 

     } 
    }); 

    // Create the custom style selector 
    $.find.selectors[":"].style = function(el, pos, match) { 

     var search = regex.expr.exec(match[3]); 

     if (search) { 

      var style = search[1] 
       ,operator = search[2] 
       ,val = search[3] 
       ,target = $(el).cssExtract(style) 
       ,compare = (function(result){ 

       if (result) { 
        return { 
         int: Number(result[1]) 
         ,metric: result[2] || "px" 
        }; 
       } 

       return null; 

      })(regex.digits.exec(val)); 

      if (
       target.metric 
       && compare && compare.metric 
       && target.metric === compare.metric 
      ) { 

       if (operator === "=" || operator === ":") { 
        return target.int === compare.int; 
       } else if (operator === "<") { 
        return target.int < compare.int; 
       } else if (operator === ">") { 
        return target.int > compare.int; 
       } 

      } else if (target.prop && (operator === "=" || operator === ":")) { 
       return target.prop === val; 
      } 

     } 

     return false; 

    }; 

})(jQuery); 

您现在应该可以使用自定义style选择器轻松查询,如下所示:

$("div:style(height=57)") 

在这个答案的时候 - 应该返回堆栈溢出(本页)的顶部div元素。

像这样的事情,甚至将工作:

$("h3:style(color:rgb(106, 115, 124))") 

尝试增加在开发工具的代码在浏览器中。我在Chrome中进行了测试。没有在其他人测试过。我也没有花太多精力研究其他已有的库/插件。