在jQuery中选择具有多个类的元素

在jQuery中选择具有多个类的元素,jquery,jquery-selectors,traversal,Jquery,Jquery Selectors,Traversal,我想选择一个有几个类的元素 类似以下HTML的内容: <div class="myclass fclass sclass tclass"></div> <div class="myclass tclass"></div> <div class="myclass sclass tclass"></div> <div class="myclass fclass tclass"></div> <div

我想选择一个有几个类的元素

类似以下HTML的内容:

<div class="myclass fclass sclass tclass"></div>
<div class="myclass tclass"></div>
<div class="myclass sclass tclass"></div>
<div class="myclass fclass tclass"></div>
<div class="myclass fclass sclass tclass"></div>

作为一个带有命名函数的回调函数可能不太好(如果您需要使用不同的类类型完成回调),但演示表明它可以工作:

$('.myclass.tclass').filter(match_exact_class);

function match_exact_class() {
    return $(this).attr('class').split(/\s+/).length == 2;
}

作为单个呼叫:

$('.myclass.tclass').filter(function match_exact_class() {
    return $(this).attr('class').split(/\s+/).length == 2;
});

$('.myclass.tclass.sclass').filter(function match_exact_class() {
    return $(this).attr('class').split(/\s+/).length == 3;
});

$('.myclass.tclass.tclass.sclass').filter(function match_exact_class() {
    return $(this).attr('class').split(/\s+/).length == 4;
});
我想你可以滚动一个简单的插件或自定义选择器,然后在选择器上拆分,比如:

var selector = '.myclass.tclass.tclass.sclass',
    sel_match = selector.split('.').length;

$(selector).filter(function match_exact_class() {
    return $(this).attr('class').split(/\s+/).length == sel_match;
});
简单自定义选择器:

jQuery.extend(jQuery.expr[':'], {
    matcls: function(elem, i, match){
        return elem.className.split(/\s+/).length == match[3].split(/\s+/).length;
    }
});

console.log($('div:matcls("myclass tclass")'));

…问题是<代码>:)在这种特殊情况下,您可能会执行
$('[class=“myclass tclass”],[class=“tclass myclass”])
,但一旦超过两个类,它就会变得复杂。或者
如果($('.myclass.tclass').attr('class')。拆分(/\s+/).length==2){…只有这两个…}
@Tats\u我只想要只包含类的元素。myclass。tclass@JaredFarrish你的第一个例子很有趣,但只有在准确的情况下它才起作用,所以它是有限的,正如你提到的,对于超过2个班级来说,它显然更棘手。谢谢,这正是我需要的,非常有趣的方法。虽然我很惊讶其他人以前没有遇到过这样的情况,因为我在这里搜索,或者他们比我聪明,并且和你一样。看看客户选择器。可能需要一些调试,并且在很多匹配中可能会比较慢。但这应该是一个开始。
jQuery.extend(jQuery.expr[':'], {
    matcls: function(elem, i, match){
        return elem.className.split(/\s+/).length == match[3].split(/\s+/).length;
    }
});

console.log($('div:matcls("myclass tclass")'));