jQuery中有样式选择器吗?

时间:2009-10-26 14:22:27

标签: jquery html css

如果我想选择其中alt为Home的每张图片,我可以这样做:

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

但是如何在单个选择器中选择width CSS属性为750px的每个元素?

编辑:如果没有这样的选择器,是否有任何插件,或者计划在下一个jQuery版本中执行此操作?

5 个答案:

答案 0 :(得分:17)

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

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

然后您可以这样使用:

$('div:width(970)')

然而,这将是非常缓慢的,所以你想要缩小你所比较的元素数量:

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

仅选择那些作为导航栏直接后代的div,其宽度也为970px。

答案 1 :(得分:15)

var $images = $("img").filter(function() {
    return $(this).css('width') == '750px';
});
编辑:没有我知道的插件,或任何包含此类特定功能的计划。您可以自己轻松地对其进行插件化,例如(未经测试):

$.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...

答案 2 :(得分:5)

我不知道这是否有效,但......:

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

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

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

答案 3 :(得分:1)

这是一个旧版本,但多亏了Jonathan del Strother的回答,它让我思考如何更多地解决这个问题:

(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)")

在回答这个问题时 - 应该返回Stack Overflow(本页)的顶部div元素。

这样的事情甚至会起作用:

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

尝试在浏览器的开发者工具中添加代码。我在Chrome中测试了它。没有在其他人测试过。我也没有投入太多工作来研究其他已有的库/插件。

答案 4 :(得分:0)

我有类似的问题。结束编写插件,根据计算出的样式选择元素。

https://github.com/MikeCostello/query-declaration

<强>的jQuery
$(":style({ width: 750px})")