代码之家  ›  专栏  ›  技术社区  ›  Buggabill

使用jquery获取元素的类列表

  •  591
  • Buggabill  · 技术社区  · 15 年前

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

    前任。

    <div class="Lorem ipsum dolor_spec sit amet">Hello World!</div>
    

    我将寻找一个“特别”的班级,如“多尔_规格”以上。我知道我可以使用hasClass(),但是实际的类名在当时可能并不一定是已知的。

    17 回复  |  直到 7 年前
        1
  •  664
  •   Mark Amery Harley Holcombe    9 年前

    你可以使用 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
        }
    });
    
        2
  •  239
  •   ndnenkov    8 年前

    为什么没有人简单地列出。

    $(element).attr("class").split(' ');
    
        3
  •  137
  •   Haroldo_OK    8 年前

    这是一个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
        }
    );
    

    这是我为演示和测试而设置的JS小提琴 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);
    
        4
  •  122
  •   Mark Amery Harley Holcombe    10 年前

    在支持浏览器上,可以使用dom元素' classList 财产。

    $(element)[0].classList
    

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

    如果需要支持不支持 分类表 属性,链接的MDN页也包含一个填充程序-尽管即使填充程序在IE 8下面的Internet Explorer版本上也不起作用。

        5
  •  58
  •   Dennis98 mwangaben    8 年前

    你应该试试这个:

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

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

        6
  •  16
  •   Fiona - myaccessible.website    13 年前
    var classList = $(element).attr('class').split(/\s+/);
    $(classList).each(function(index){
    
         //do something
    
    });
    
        7
  •  7
  •   alexche8    11 年前
    $('div').attr('class').split(' ').map(function(cls){ console.log(cls);})
    
        8
  •  5
  •   DutchKevv    7 年前

    更新:

    正如@Ryan Leonard正确指出的那样,我的回答并不能真正解决我自己提出的问题…您需要同时使用(例如)字符串修剪和删除双空格。请替换(/+/g,“”)。或者可以拆分el.classname,然后使用arr.filter(布尔值)删除空值。

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

    或更现代

    const classes = element.classList;
    

    旧的:

    因为类被添加和删除,所以类字符串之间可能有多个空格。例如,‘1类2 3类’…

    这将变成[‘class1’、‘class2’、‘class2’、‘class’、‘class3’]。

    使用trim时,所有 倍数 删除空间..

        9
  •  3
  •   Phoenix    9 年前

    这也能帮到你吗?我用这个函数来获取儿童元素的类。

    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();
        });
    }
    

    在你的情况下,你希望多尔·伊普桑,你现在可以这样做了。 calsses[2]; .

        10
  •  2
  •   Sumit Raju    9 年前

    试试这个。这将从文档的所有元素中获取所有类的名称。

    $(document).ready(function() {
    var currentHtml="";
    $('*').each(function() {
        if ($(this).hasClass('') === false) {
            var class_name = $(this).attr('class');
            if (class_name.match(/\s/g)){
                var newClasses= class_name.split(' ');
                for (var i = 0; i <= newClasses.length - 1; i++) {
                    if (currentHtml.indexOf(newClasses[i]) <0) {
                        currentHtml += "."+newClasses[i]+"<br>{<br><br>}<br>"
                    }
                }
            }
            else
            {
                if (currentHtml.indexOf(class_name) <0) {
                    currentHtml += "."+class_name+"<br>{<br><br>}<br>"
                }
            }
        }
        else
        {
            console.log("none");
        }
    });
    $("#Test").html(currentHtml);
    

    (});

    以下是工作示例: https://jsfiddle.net/raju_sumit/2xu1ujoy/3/

        11
  •  1
  •   Alan L.    13 年前

    多亏了这个-我也遇到了类似的问题,因为我正试图通过编程将对象与层次类名称联系起来,尽管这些名称可能不一定是我的脚本所知道的。

    在我的剧本里,我想要一个 <a> 标记以打开/关闭帮助文本,方法是 <A & GT; 标签 [some_class] 加上 toggle 然后给它的帮助文本 [some_class]_toggle . 此代码使用jquery成功查找相关元素:

    $("a.toggle").toggle(function(){toggleHelp($(this), false);}, function(){toggleHelp($(this), true);});
    
    function toggleHelp(obj, mode){
        var classList = obj.attr('class').split(/\s+/);
        $.each( classList, function(index, item){
        if (item.indexOf("_toggle") > 0) {
           var targetClass = "." + item.replace("_toggle", "");
           if(mode===false){$(targetClass).removeClass("off");}
           else{$(targetClass).addClass("off");}
        }
        });
    } 
    
        12
  •  0
  •   Anuj J    11 年前

    javascript为dom中的节点元素提供一个classlist属性。简单使用

      element.classList
    

    将返回窗体的对象

      DOMTokenList {0: "class1", 1: "class2", 2: "class3", length: 3, item: function, contains: function, add: function, remove: function…}
    

    对象具有包含、添加、删除等功能,您可以使用这些功能

        13
  •  0
  •   eva    8 年前

    对于一个类型为image的元素,我有一个类似的问题。我需要检查元素是否属于某个类。首先我尝试了:

    $('<img>').hasClass("nameOfMyClass"); 
    

    但我得到了一个很好的“这个函数不适用于这个元素”。

    然后我检查了dom explorer上的元素,发现了一个非常好的属性,可以使用:classname。它包含元素的所有类的名称,用空格分隔。

    $('img').className // it contains "class1 class2 class3"
    

    一旦你得到这个,像往常一样把绳子分开。

    在我的案例中,这起作用:

    var listOfClassesOfMyElement= $('img').className.split(" ");
    

    我假设这将适用于其他类型的元素(除了img)。

    希望它有帮助。

        14
  •  -3
  •   gesellix    15 年前

    有点晚了,但是使用extend()函数可以在任何元素上调用“hasClass()”,例如:
    var hasClass = $('#divId').hasClass('someClass');

    (function($) {
    $.extend({
        hasClass: new function(className) {
            var classAttr = $J(this).attr('class');
            if (classAttr != null && classAttr != undefined) {
                var classList = classAttr.split(/\s+/);
                for(var ix = 0, len = classList.length;ix < len;ix++) {
                    if (className === classList[ix]) {
                        return true;
                    }
                }
            }
            return false;
        }
    }); })(jQuery);
    
        15
  •  -3
  •   john k    10 年前

    问题是jquery的设计目的是什么。

    $('.dolor_spec').each(function(){ //do stuff
    

    为什么没有人给予 .find() 作为答案?

    $('div').find('.dolor_spec').each(function(){
      ..
    });
    

    还有非IE浏览器的类列表:

    if element.classList.contains("dolor_spec") {  //do stuff
    
        16
  •  -4
  •   Gregra    13 年前

    给你,调整一下 读正方形 返回所有类的数组的答案:

    function classList(elem){
       var classList = elem.attr('class').split(/\s+/);
        var classes = new Array(classList.length);
        $.each( classList, function(index, item){
            classes[index] = item;
        });
    
        return classes;
    }
    

    将jquery元素传递给函数,以便示例调用为:

    var myClasses = classList($('#myElement'));
    
        17
  •  -4
  •   dulebov.artem    10 年前

    我知道这是一个古老的问题,但仍然如此。

    <div id="specId" class="Lorem ipsum dolor_spec sit amet">Hello World!</div>
    
    var className=".dolor_spec" //dynamic
    

    如果要操作元素

    $("#specId"+className).addClass('whatever');
    

    如果要检查元素是否具有类

     $("#specId"+className).length>0
    

    如果多个类

    //if you want to select ONE of the classes
    var classNames = ['.dolor_spec','.test','.test2']
    $("#specId"+classNames).addClass('whatever');
    $("#specId"+classNames).length>0
    //if you want to select all of the classes
    var result = {className: ""};
    classNames.forEach(function(el){this.className+=el;},result);
    var searchedElement= $("#specId"+result.className);
    searchedElement.addClass('whatever');
    searchedElement.length>0