jQuery属性选择器可以使用“OR”运算符吗?

时间:2011-10-17 09:17:12

标签: jquery jquery-selectors

是否可以使用“OR”运算符或类似函数重写以下选择器?

$("a[href$='avi'], a[href$='mov'], a[href$='mp4'], a[href$='m4v']")

理想情况如下:

$("a[href$='avi|mov|mp4|m4v']") // incorrect

从键盘上多走几英里。我有test fiddle

3 个答案:

答案 0 :(得分:3)

不,CSS没有这个(它会在attribute selectors区域),jQuery也没有添加它(参见"attribute ends with" docs)。

当然,如果你不介意不能匹配|字符,那么你可以给自己一个实用功能:模糊这样:

(function($) {
    $.attrEndsWith = attrEndsWith;
    function attrEndsWith(tag, attr, list) {
        return $(tag + "[" + attr + "$='" + list.split("|").join("'], " + tag + "[" + attr + "$='") + "']");
    }
})(jQuery);

并使用了:

$.attrEndsWith("a", "href", "avi|mov|mp4|m4v");

这是未经测试的,但你明白了。

答案 1 :(得分:2)

您可以通过使用James Padolseys Regex Selector for jQuery扩展jQuery来实现此目的。当你想把正则表达式放入你的选择器时非常有用。

Run this code in Test fiddle

jQuery.expr[':'].regex = function(elem, index, match) {
    var matchParams = match[3].split(','),
        validLabels = /^(data|css):/,
        attr = {
            method: matchParams[0].match(validLabels) ?
                        matchParams[0].split(':')[0] : 'attr',
            property: matchParams.shift().replace(validLabels,'')
        },
        regexFlags = 'ig',
        regex = new RegExp(matchParams.join('').replace(/^\s+|\s+$/g,''), regexFlags);
    return regex.test(jQuery(elem)[attr.method](attr.property));
}

$("a[href$='avi'], a[href$='mov'], a[href$='mp4'], a[href$='m4v']")
    .addClass("select");


$('a:regex(href,avi|mov|mp4|m4v)').addClass("betterSelect"); 

答案 2 :(得分:1)

$("a").filter(function(){ return /(avi|mov|mp4|m4v)$/i.test($(this).attr('href')); }).addClass('betterSelect');

不是你想要的答案,但也许会有所帮助。