使用jQuery获取元素的类列表

Bug*_*ill 636 html javascript jquery

有没有一种方法可以在jQuery中循环或为数组分配所有分配给元素的类?

恩.

<div class="Lorem ipsum dolor_spec sit amet">Hello World!</div>
Run Code Online (Sandbox Code Playgroud)

我将在上面的"dolor_spec"中寻找一个"特殊"类.我知道我可以使用hasClass(),但实际的类名可能不一定是当时已知的.

red*_*are 702

您可以使用它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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 自己添加一个jQuery插件:`$ .fn.classList = function(){return this [0] .className.split(/\s + /);};` (68认同)
  • 仅供参考:jQuery使用className.split(/\s + /) (35认同)
  • @RobertoLinares看到http://gyazo.com/04490233dcc9fb3e1a133ada848a986c为什么 (7认同)
  • 这正是我所做的,但我不确定是否有一个jQuery函数的构建,它给了你一个类的集合. (4认同)
  • 更好的答案[下方](http://stackoverflow.com/a/36914305/4632019) (3认同)
  • 或者你可以:`if ($.inArray("someclass",classList)&gt;=0) { /* hasClass someclass*/ }` (2认同)

小智 269

为什么没有人简单列出.

$(element).attr("class").split(/\s+/);
Run Code Online (Sandbox Code Playgroud)

  • 因为这是错的!类可以用任何类型的空格分隔(例如,你可以将HTML中的长类属性包装到多行),但是这个答案没有考虑到这一点.尝试将`$('<div class ="foo bar baz">').attr("class").split('')`粘贴到浏览器控制台(其中有一个制表符); 你会得到`["foo","bar baz"]`而不是正确的类列表`["foo","bar","baz"]`. (51认同)
  • 这是已接受答案的一部分......我需要应用于元素的所有类. (6认同)
  • @GordonRouse一个额外的空间爬进一个类列表是很常见的,特别是如果某种逻辑正在写出类列表. (5认同)
  • 我认为在99%的情况下,这个解决方案是有效的,即提供您控制HTML.我想不出任何理由我们需要支持标签或类名之间多个空格的可能性,即使HTML标准允许这样做. (4认同)
  • @MarkAmery是对的.如果你有一个`class ="foo <很多空格> bar"`,你最终会得到一个带有空字符串元素的数组. (2认同)
  • 因为3年后,一些开发人员会将你的代码用于一些不可预见的目的,并且不小心或故意将回车,标签或额外空间放在你不期望的地方,而且一切都会破裂. (2认同)
  • 你不能只是 split(/\s+/) 吗?这摆脱了所有的空间块 (2认同)

Wil*_*ill 141

这是一个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);
Run Code Online (Sandbox Code Playgroud)

像它一样使用它

$('div').classes();
Run Code Online (Sandbox Code Playgroud)

在你的情况下返回

["Lorem", "ipsum", "dolor_spec", "sit", "amet"]
Run Code Online (Sandbox Code Playgroud)

您还可以将函数传递给要在每个类上调用的方法

$('div').classes(
    function(c) {
        // do something with each class
    }
);
Run Code Online (Sandbox Code Playgroud)

这是一个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);
Run Code Online (Sandbox Code Playgroud)


Peh*_*elu 136

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

$(element)[0].classList
Run Code Online (Sandbox Code Playgroud)

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

如果您需要支持不支持该classList属性的旧浏览器版本,链接的MDN页面也包含一个垫片 - 尽管即使是垫片也不适用于IE 8以下的Internet Explorer版本.

  • 您可以使用“[...iterable]”或“Array.from(iterable)”轻松将任何可迭代对象转换为“Array” (2认同)

P.P*_*kov 73

你应该尝试这个:

$("selector").prop("classList")
Run Code Online (Sandbox Code Playgroud)

它返回元素的所有当前类的数组.

  • 嗯,我不知道.但这是从DOM元素获取属性的正确方法.并且"classList"是这样的属性,它为您提供应用于该元素的css类数组. (5认同)
  • 请注意,`classList` 属性不适用于 IE 10/11 的 SVG 元素(尽管它适用于 HTML 元素)。请参阅 https://developer.mozilla.org/en-US/docs/Web/API/Element/classList (3认同)

小智 16

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

     //do something

});
Run Code Online (Sandbox Code Playgroud)


ale*_*he8 7

$('div').attr('class').split(' ').map(function(cls){ console.log(cls);})
Run Code Online (Sandbox Code Playgroud)

  • 这是对.map的可怕滥用;如果您不需要`.map`的返回值,请使用`.each`。在空格而不是任何空格上的拆分也被破坏了-请参阅我对http://stackoverflow.com/a/10159062/1709587的评论。即使这些观点都不成立,这也没有为页面增加任何新内容。-1! (2认同)

Dut*_*evv 6

更新:

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

const classes = element.className.split(' ').filter(Boolean);
Run Code Online (Sandbox Code Playgroud)

或更现代

const classes = element.classList;
Run Code Online (Sandbox Code Playgroud)

旧:

有了所有给定的答案,你永远不应该忘记用户.trim()(或$ .trim())

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

这会变成['class1','class2','','','','class3'] ..

使用trim时,会删除所有多个空格.

  • 这是不正确的(而不是答案).String.trim()和$ .trim()都删除所有前导和尾随空格,并保留字符串的其余部分.https://jsconsole.com/?%22%20%20a%20%20b%20%20%22.trim() (2认同)
  • 我确实看到了其他答案,并同意应在类名之间删除空格.我指出a)这应该是对其他解决方案的评论,因为它不是一个完整的答案b).trim()确实*不*删除多个空格来实现你所需要的. (2认同)