使用jQuery获取元素的类列表

741
有没有一种在jQuery中循环或分配一个数组,用于存储分配给元素的所有类别的方法?
例如。
<div class="Lorem ipsum dolor_spec sit amet">Hello World!</div>

我将寻找一个类似于上面的 "dolor_spec" 的“特殊”类。我知道我可以使用 hasClass(),但实际的类名可能在此时并不确定。


我将寻找一个“特殊”的类,就像上面的“dolor_spec”一样。我知道我可以使用 hasClass() 方法,但实际的类名可能在此时是未知的。

如果您在此时不知道类名,无法使用hasClass(),那么您打算如何知道数组中的哪一个? - doomspork
我正在设计一个表单,使用jQuery进行一些初步验证。如果生成了错误提示,我会将输入元素的id添加到错误提示div的class列表中。然后,我使得可以点击错误提示div来聚焦到有错误的输入元素上。这个脚本将用于多个表单,所以我不想在脚本中硬编码这些id。 - Buggabill
1
我明白为什么你不想硬编码。但是如果你花点时间看一下redsquare的例子,你会发现你必须将“someClass”硬编码到if块中。无论如何,你都可以用一个变量来实现这个目标。 - doomspork
与其使用类属性,您可以在命名空间内拥有一个错误列表变量,其中包含具有错误的元素的DOM引用。这样就可以消除每次拉取属性列表、迭代它、查找DOM元素并将其聚焦的需要。 - doomspork
16个回答

790
你可以使用document.getElementById('divId').className.split(/\s+/);来获取一个类名数组。
然后你可以遍历并找到你想要的类名。
var classList = document.getElementById('divId').className.split(/\s+/);
for (var i = 0; i < classList.length; i++) {
    if (classList[i] === 'someClass') {
        //do something
    }
}

jQuery在这里并没有真正帮助到你...

var classList = $('#divId').attr('class').split(/\s+/);
$.each(classList, function(index, item) {
    if (item === 'someClass') {
        //do something
    }
});

您可以使用

if ($('#divId').hasClass('someClass')) {
    //do something
}

4
这正是我本应该做的,但我不确定是否有一个内置的jQuery函数可以返回一组类。 - Sander
39
jQuery使用className.split(/\s+/)。 - kͩeͣmͮpͥ ͩ
74
自行添加一个 jQuery 插件:$.fn.classList = function() {return this[0].className.split(/\s+/);};。该插件可用于获取元素的类名列表。 - ripper234

338

为什么没有人简单地列出呢?

$(element).attr("class").split(/\s+/);

编辑:为了解决@MarkAmery的反对意见,将分隔符从' '改为/\s+/。(感谢@YashaOlatoto)。


7
那是被认可的答案的一部分......我需要获取应用于元素的全部类。 - Buggabill
哈哈,没错!我就是想要这个。它返回一个由空格分隔的类字符串,所以如果你想挑选其中一个,可以通过空格拆分字符串并获取一个数组来选择一个类。 - Rahul Dole
56
因为这是错误的!类可以通过任何类型的空格分隔(例如,您可以将HTML中的长类属性包装到多行中),但这个答案没有考虑到这一点。尝试将$('<div class="foo bar baz">').attr("class").split(' ')粘贴到您的浏览器控制台中(其中有一个制表符);您会得到["foo", "bar baz"]而不是正确的类列表["foo", "bar", "baz"] - Mark Amery
2
@MarkAmery是正确的。如果你有一个class="foo <lots of spaces here> bar",你最终会得到一个带有空字符串元素的数组。 - Jacob van Lingen
@JacobvanLingen 现代浏览器是否支持在类之间有大量空格的情况? - Philip

169

在支持的浏览器中,您可以使用DOM元素的classList属性。

$(element)[0].classList

它是一个类似于数组的对象,列出了元素拥有的所有类。

如果需要支持不支持classList属性的旧浏览器版本,则链接的MDN页面还包括其的替代方法 - 尽管即使在IE 8以下的版本中,该替代方法也无法工作。


1
@Marco Sulla:这确实有一个缺点,除了支持过时的软件之外。.classList不是真正的数组,因此.indexOf(⋯)等方法无法在其上工作。它只是一个“类似数组的对象”,而.className.split(/\s+/).indexOf(⋯)(来自接受的答案)可以工作。 - Incnis Mrsi
3
你可以使用 [...iterable]Array.from(iterable) 将任何可迭代对象轻松转换为 Array - Marco Sulla

142

这是一个jQuery插件,它将返回匹配元素具有的所有类别的数组

;!(function ($) {
    $.fn.classes = function (callback) {
        var classes = [];
        $.each(this, function (i, v) {
            var splitClassName = v.className.split(/\s+/);
            for (var j = 0; j < splitClassName.length; j++) {
                var className = splitClassName[j];
                if (-1 === classes.indexOf(className)) {
                    classes.push(className);
                }
            }
        });
        if ('function' === typeof callback) {
            for (var i in classes) {
                callback(classes[i]);
            }
        }
        return classes;
    };
})(jQuery);

使用方法如下:

$('div').classes();

在您的情况下,返回结果为
["Lorem", "ipsum", "dolor_spec", "sit", "amet"]

您可以将一个函数传递给该方法,在每个类上调用。
$('div').classes(
    function(c) {
        // do something with each class
    }
);

这是我准备的一个jsFiddle,用于演示和测试http://jsfiddle.net/GD8Qn/8/

压缩后的JavaScript代码

;!function(e){e.fn.classes=function(t){var n=[];e.each(this,function(e,t){var r=t.className.split(/\s+/);for(var i in r){var s=r[i];if(-1===n.indexOf(s)){n.push(s)}}});if("function"===typeof t){for(var r in n){t(n[r])}}return n}}(jQuery);

107

你应该尝试这一个:

$("selector").prop("classList")

它返回该元素的所有当前类的列表。


6
我不知道。但这是从DOM元素获取属性的正确方式。"classList"是这样一种属性,它会给你一个包含应用于该元素的CSS类的数组。 - P.Petkov
@RozzA 也许那时还没有这个方法?但我认为这是目前最合适的方法,除非您不使用jQuery,在这种情况下,一个简单的.classList就是解决方案 - 您只需要注意不一致性和/或缺少的浏览器支持。 - Dennis98
@Dennis98 不错的建议,有时候我会忘记最近新功能的快速推出。我也使用过纯JS的.classList,在现代浏览器中效果非常好。 - RozzA
3
请注意,classList 属性在 IE 10/11 上不适用于 SVG 元素(尽管对 HTML 元素适用)。请参见 https://developer.mozilla.org/en-US/docs/Web/API/Element/classList。 - Métoule
@Métoule,对于HTML元素,.prop('classList')可能在IE9中无法正常工作。 - Bob Stein

17
var classList = $(element).attr('class').split(/\s+/);
$(classList).each(function(index){

     //do something

});

8
$('div').attr('class').split(' ').each(function(cls){ console.log(cls);})

2
这是对.map的可怕滥用;如果您不需要.map的返回值,请使用.each。将字符串按空格拆分而不是任何空白也是错误的 - 请参见我在https://dev59.com/bHM_5IYBdhLWcg3wymY0#10159062上的评论。即使这些观点都不正确,这也不会为页面添加任何新内容。-1! - Mark Amery

7

更新:

正如@Ryan Leonard正确指出的那样,我的答案并没有真正解决我自己提出的问题...你需要使用(例如)string.replace(/ +/g, " ")同时修剪和删除双空格...或者你可以分割el.className,然后使用(例如)arr.filter(Boolean)删除空值。

const classes = element.className.split(' ').filter(Boolean);

更现代化
const classes = element.classList;

新的翻译:

在所有给出的答案中,您不应忘记使用.trim()(或$.trim())。

因为类会添加和删除,所以在类字符串之间可能会有多个空格。例如,'class1 class2 class3'。

这将变成 ['class1','class2','','','','class3']。

当您使用 trim 时,所有多个空格都将被删除。


2
这是不正确的(也不是答案)。String.trim()和$.trim()都会删除所有前导和尾随空格,并保留字符串的其余部分。https://jsconsole.com/?%22%20%20a%20%20b%20%20%22.trim() - Ryan Leonard
你看过答案了吗?所有原生JS的解决方案都没有检查前导和尾随空格,因此会在数组中产生错误的类列表,因为其中会有空类。jQuery在读取类时内部也使用trim执行相同的操作。 - DutchKevv
2
我看到了其他的答案,并同意在类名之间应该删除空格。我想指出的是: a)这应该是对其他解决方案的评论,因为它不是一个完整的答案 b).trim()不能删除多个空格以达到你需要的效果。 - Ryan Leonard
1
您说得完全正确... 对于我过于匆忙的评论感到抱歉... 它不会删除类之间的空格... 需要使用 s.trim().replace(/ +/g, " ") 或其他方法来删除所有类之间的多个空格.. 此外,el.classList 几乎被广泛支持,我想这可以解决所有问题.. - DutchKevv
1
没有问题。非常高兴地点赞,.classList 是一种更加简洁的方法! - Ryan Leonard

3
也许这个对你也有帮助。我用了这个函数来获取子元素的类。
function getClickClicked(){
    var clickedElement=null;
    var classes = null;<--- this is array
    ELEMENT.on("click",function(e){//<-- where element can div,p span, or any id also a class
        clickedElement = $(e.target);
        classes = clickedElement.attr("class").split(" ");
        for(var i = 0; i<classes.length;i++){
            console.log(classes[i]);
        }
        e.preventDefault();
    });
}

在你的情况下,如果你想要doler_ipsum类,你现在可以这样做:calsses[2];

3

我们可以使用以下方法获取应用于元素的类列表:

$('#elementID').prop('classList')

如果要添加或删除任何类,我们可以按照以下方式进行操作。

$('#elementID').prop('classList').add('yourClassName')
$('#elementID').prop('classList').remove('yourClassName')

如果只是检查类是否存在,我们可以使用 hasClass 方法。


不回答问题 - Aurovrata
$('#elementID').prop('classList') 用于获取元素的类列表,进一步地,使用 .add 和 .remove 方法来对类列表进行更改。问题不是在问如何在 JQuery 中获取类列表吗? - Mantra
事实上,问题明确要求如何获取类列表以便循环遍历,没有提到添加或删除类。此外,您的答案未能解释它的作用。请考虑改进它。 - Aurovrata
@Aurovrata:谢谢,我已经改进了答案,请根据要求随意进一步完善它。 - Mantra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接