使用jQuery获取元素的类列表

2020/09/22 19:41 · javascript ·  · 0评论

jQuery中是否有一种方法可以循环或将分配给元素的所有类分配给数组?

例如

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

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

您可以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
    }
});

为什么没有人简单列出。

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

编辑:拆分/\s+/而不是' '修复@ MarkAmery的异议。(感谢@ YashaOlatoto

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

$(element)[0].classList

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

如果您需要支持不支持该classList属性的旧浏览器版本,则链接的MDN页面还包含一个填充程序-尽管即使该填充程序也无法在IE 8以下的Internet Explorer版本上运行。

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

您应该尝试以下一种方法:

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

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

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

     //do something

});

更新:

正如@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']。

使用修剪时,所有多个空格都将被删除。

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

可能对您有帮助。我已经使用此函数来获取子元素的类。

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];

谢谢您-我遇到了一个类似的问题,因为我试图以编程方式将对象与分层类名称相关联,即使这些名称不一定是我的脚本知道的。

在我的脚本中,我希望<a>标签通过给<a>标签[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");}
    }
    });
} 

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

$(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/

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

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

但是我得到了一个很好的“此元素不可用此功能”。

然后,我在DOM资源管理器上检查了元素,并看到了可以使用的非常好的属性:className。它包含我的元素的所有类的名称,用空格分隔。

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

一旦获得此权限,只需照常拆分字符串即可。

就我而言,这可行:

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

我假设这将与其他类型的元素一起工作(除了img)。

希望能帮助到你。

javascript为dom中的节点元素提供了classList属性。只需使用

  element.classList

将返回一个形式的对象

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

该对象具有包含,添加,删除之类的功能,可以使用

您可以按照以下步骤进行操作。

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

有点晚了,但是使用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);

问题是Jquery打算做什么。

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

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

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

对于非IE浏览器,还有classList:

if element.classList.contains("dolor_spec") {  //do stuff

在这里,只需调整readsquare的答案即可返回所有类的数组:

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'));
本文地址:http://javascript.askforanswer.com/shiyongjqueryhuoquyuansudeleiliebiao.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!