在jQuery中过滤掉一个元素的类?

时间:2011-11-08 15:41:59

标签: javascript jquery

过滤给定元素上的类列表的最有效方法是什么?

<div class="foo bar"></div>
<div class="bim bar"></div>

$("div.bar").click(function(ev) {
  alert("The non-bar class was:" + ???);
});

我知道我可以写一个for循环来浏览ev.currentTarget.classList,但我想知道是否有更好的方法。

编辑:我想澄清一下,我希望警报告诉我“foo”和“bim”。我不想替换“bar”,我只是希望能够访问非bar的类。感谢。

2 个答案:

答案 0 :(得分:5)

没有 jQuery 的方式来实现这一点,但我会这样做:

$("div.bar").click(function(ev) {
    var nonBarClasses = (' ' + this.className + ' ').replace(' bar ', ' ').split(/ +/);

    nonBarClasses.shift();
    nonBarClasses.pop();

    // nonBarClasses is now an array, with each element a class that isn't `bar`

    alert("The non-bar class was: " + nonBarClasses.join(" ")); 
});

在此处查看此行动:http://jsfiddle.net/PpUeX/2

答案 1 :(得分:4)

您可以使用jQuery.fn.attr()从元素中获取整个类字符串,然后split()将其添加到数组中,您可以使用该数组执行任何操作。

$("div.bar").click(function(ev) {
  var classes = $(this).attr('class').split(' '); // [0:'foo', 1:'bar']
});

编辑:至于提供一个“jQuery” - 获取所有非“bar”类的方法,你可以在点击的元素和clone()之前创建一个临时的removeClass()条形类你用它做任何事情:

$("div.bar").click(function(ev) {
  var noBarClasses = $(this)
    .clone().removeClass('bar') // <-- no more "bar"
    .attr('class').split(' '); // [0:'foo']
});