代码之家  ›  专栏  ›  技术社区  ›  Alon Gubkin

jquery中有样式选择器吗?

  •  15
  • Alon Gubkin  · 技术社区  · 15 年前

    例如,如果我想选择alt所在的每个图像,我可以这样做:

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

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

    编辑: 如果没有这样的选择器,在下一个jquery版本中是否有插件或者计划这样做?

    5 回复  |  直到 7 年前
        1
  •  17
  •   Jonathan del Strother    15 年前

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

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

    你可以这样使用:

    $('div:width(970)')
    

    不过,这将是非常缓慢的,所以您希望缩小与以下内容比较的元素的数量:

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

    只选择那些是导航栏的直接子代,宽度也为970px。

        2
  •  15
  •   karim79    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...
    
        3
  •  5
  •   Powerlord    15 年前

    我不知道这样行不行,但是……

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

    但是,最好使用类来控制宽度,然后修改该类所有实例的宽度…或者换一个不同的班级:

    $(".classname").removeClass("classname").addClass("otherclassname");
    
        4
  •  1
  •   Erutan409    7 年前

    这是一个旧的问题,但多亏了乔纳森德尔斯特罗瑟的回答,我开始思考如何进一步解决这个问题:

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

    尝试在浏览器的开发人员工具中添加代码。我用铬做了测试。没有在其他地方测试过。我也没有花太多的精力去研究其他已经存在的库/插件。

        5
  •  0
  •   Mike    9 年前

    我也有类似的问题。最后编写了一个插件来根据元素的计算样式选择元素。

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

    JQuery
    $(":style({ width: 750px})")