JQuery ile öğe için sınıf listesi alın


657

JQuery'de bir öğeye atanan tüm sınıfları döngü veya atama için bir yol var mı?

ex.

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

Yukarıdaki "dolor_spec" 'de olduğu gibi bir "özel" sınıf arayacağım. HasClass () kullanabileceğinizi biliyorum ama gerçek sınıf adı o anda bilinmeyebilir.


O zaman sınıf adını bilmiyorsanız, hasClass () kullanmanız engellenirse, dizide hangisinin olduğunu nasıl anlarsınız?
doomspork

JQuery ile bazı ön doğrulama yaptığım bir form tasarlıyorum. Girilirse, hata div sınıf listesine giriş öğesinin kimliğini ekliyorum. Daha sonra hatalı giriş elemanına odaklanmak için hata div'ı tıklamayı mümkün kılıyorum. Bu komut dosyası birden fazla form için kullanılacak. Bu yüzden komut dosyasındaki kimlikleri sabit kodlamak istemiyorum.
Buggabill

1
Doğru, neden sabit kodlamak istemeyeceğinizi anlıyorum. Ancak redsquare'in örneğine bakmak için bir dakikanızı ayırırsanız, if bloğuna 'someClass' kodunu girmeniz gerektiğini görürsünüz. Her iki durumda da bunu bir değişkenle başarabilirsiniz.
doomspork

Class özniteliğini kullanmak yerine, ad alanınızda hata içeren öğelere DOM başvuruları içeren bir hata listesi değişkeniniz olabilir. Böylece öznitelik listesini her seferinde çekme, yineleme, DOM öğesini bulma ve odaklama ihtiyacını ortadan kaldırır.
doomspork

Yanıtlar:


732

Size document.getElementById('divId').className.split(/\s+/);bir dizi sınıf adı almak için kullanabilirsiniz .

Sonra tekrarlayabilir ve istediğiniz birini bulabilirsiniz.

var classList = document.getElementById('divId').className.split(/\s+/);
for (var i = 0; i < classList.length; i++) {
    if (classList[i] === 'someClass') {
        //do something
    }
}

jQuery burada size gerçekten yardımcı olmuyor ...

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

4
tam olarak ben ne woud yaptık, ama ben sınıfları bir koleksiyon veren jQuery işlevinde bir yapı olup olmadığını emin değildi.
Sander

36
Bilginize: jQuery className.split (/ \ s + /) kullanır
kͩeͣmͮpͥ ͩ

70
Kendiniz bir jQuery eklentisi ekleyin:$.fn.classList = function() {return this[0].className.split(/\s+/);};
ripper234 9:12

1
ya da daha sonra şunları yapabilirsiniz: if ($.inArray("someclass",classList)>=0) { /* hasClass someclass*/ }
sambomartin

Burada bir javascript uzmanı değil. Bana split'in (/ \ s + /) sadece split ("") yapmaktan daha iyi olup olmadığını söyleyebilir misiniz? Benim için aynı şekilde FF23 / Chrome28 / IE8'de çalışıyor.
Roberto Linares

288

Neden hiç kimse basitçe listelenmedi.

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

EDIT: @MarkAmery belirttiği gibi, sadece .split(' ')sınıf adları herhangi bir boşluk ile ayrılabilir çünkü olamaz.


6
Bu kabul edilen cevabın bir parçası ... Bir elemente uygulanan tüm sınıflara ihtiyacım vardı.
Buggabill

54
Çünkü yanlış! Sınıflar her tür boşlukla ayrılabilir (örneğin HTML'nizde uzun bir sınıf niteliğini birden çok satıra sarabilirsiniz), ancak bu cevap bunu hesaba katamaz. $('<div class="foo bar baz">').attr("class").split(' ')Tarayıcı konsolunuza yapıştırmayı deneyin (orada bir sekme karakteri vardır); ["foo", "bar baz"]doğru sınıf listesi yerine alırsınız ["foo", "bar", "baz"].
Mark Amery

2
@MarkAmery haklı. A'ya sahip class="foo <lots of spaces here> bar"olsaydınız, boş dize öğelerine sahip bir dizi elde edersiniz.
Jacob van Lingen

4
Durumların% 99'unda bu çözümün etkili olduğunu düşünüyorum, yani HTML'yi kontrol etmenizi sağlar. HTML standartları buna izin verse bile, sınıf adları arasında sekmeler veya birden çok boşluk olasılığını desteklememiz için herhangi bir sebep düşünemiyorum.
Gordon Rouse

5
Bir sınıf listesine sürünen fazladan bir alan, özellikle sınıfların bir tür mantığı yazıyorsa, oldukça yaygındır.
Eric

142

Desteklenen tarayıcılarda DOM öğelerinin classListözelliğini kullanabilirsiniz.

$(element)[0].classList

Öğenin sahip olduğu tüm sınıfları listeleyen dizi benzeri bir nesnedir.

classListMülkü desteklemeyen eski tarayıcı sürümlerini desteklemeniz gerekiyorsa , bağlı MDN sayfası da bunun için bir şim içerir - şim bile IE 8 altındaki Internet Explorer sürümlerinde çalışmaz.


Cevabı temizleyin ve tekerleği yeniden icat etmez.
Marco Sulla

@Marco Sulla: Bu gerçekten eski yazılım desteği dışında bir eksiklik var. .classListgerçek bir dizi değil ve .indexOf(⋯)üzerinde çalışma gibi yöntemler . Sadece "dizi benzeri bir nesne" iken .className.split(/\s+/).indexOf(⋯)(kabul edilen cevaptan) çalışır.
Incnis Mrsi

Kolayca herhangi bir Arraykullanarak [...iterable]veya dönüştürebilirsinizArray.from(iterable)
Marco Sulla

142

Eşleşen öğelerin sahip olduğu tüm sınıfların bir dizisini döndürecek bir jQuery eklentisi

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

Gibi kullanın

$('div').classes();

Davanızda iade

["Lorem", "ipsum", "dolor_spec", "sit", "amet"]

Her sınıfta çağrılacak yönteme bir işlev de iletebilirsiniz

$('div').classes(
    function(c) {
        // do something with each class
    }
);

İşte göstermek ve test etmek için ayarladığım bir jsFiddle http://jsfiddle.net/GD8Qn/8/

Küçültülmüş 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);

Sınıfları bir Etkinliğin className özniteliğine kopyalarken FullCalendar için mükemmel uyum .
Dan Power

78

Bunu denemelisiniz:

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

Öğenin tüm geçerli sınıflarının bir dizisini döndürür.


bu kabul edilen cevabı çok daha temiz, bu yöntemi kullanmamak için bir sebep var mı?
RozzA

5
Bilmiyorum. Ancak bu, DOM öğesinden özellik almanın uygun yoludur. Ve "classList" öğeye uygulanan bir dizi css sınıfı veren bir özelliktir.
P.Petkov

@RozzA Belki o zaman mevcut değildi? Ama basit bir .classListçözüm olduğu jQuery kullanmıyorsanız, şu andan itibaren en uygun yöntem olduğunu söyleyebilirim - sadece tutarsızlıklara ve / veya eksik tarayıcı desteğine dikkat etmeniz gerekir ..
Dennis98

@ Dennis98 iyi çağrı, bazen yeni özelliklerin son zamanlarda ne kadar hızlı çıktığını unutuyorum. Ayrıca .classListmodern tarayıcılarda oldukça iyi çalışan düz js yaptım
RozzA

1
O Not classListözelliği (HTML elemanları için çalışmasına rağmen) SVG öğeleri için IE 10/11 üzerinde çalışmaya yapmaz. Bkz developer.mozilla.org/en-US/docs/Web/API/Element/classList
Métoule

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

     //do something

});

7

Güncelleme:

@Ryan Leonard'ın doğru şekilde işaret ettiği gibi, cevabım kendimi yaptığım noktayı gerçekten düzeltmiyor ... (örneğin) string.replace (/ + / g, "") ile çift boşlukları hem kırpmanız hem de kaldırmanız gerekiyor .. Veya el.className öğesini bölebilir ve sonra boş değerleri (örneğin) arr.filter (Boolean) ile kaldırabilirsiniz.

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

veya daha modern

const classes = element.classList;

Eski:

Verilen tüm cevaplarla, .trim () (veya $ .trim ()) kullanıcılarını asla unutmamalısınız.

Sınıflar eklendiği ve kaldırıldığı için, sınıf dizesi arasında birden fazla boşluk olabilir. Örneğin, 'class1 class2 class3' ..

Bu ['class1', 'class2', '', '', '', 'class3'] olur.

Trim kullandığınızda, birden fazla alan kaldırılır.


2
Bu yanlış (ve bir cevap değil). Hem String.trim () hem de $ .trim () tüm önde gelen ve arkadaki boşlukları kaldırır ve dizenin geri kalanını yalnız bırakır. jsconsole.com /?% 22% 20% 20a% 20% 20b% 20% 20% 22.trim ()
Ryan Leonard

Cevaplara bir göz attınız mı? O sınıfları okuduğunda tüm yerli JS çözümleri dizide boş sınıfları olacağını olarak böylece hatalı bir sınıf listesi vererek lider ve boşlukları sondaki için onay vermedi .. jQuery içten kesmesi ile aynı işi yapar
DutchKevv

2
Diğer cevapları gördüm ve sınıf isimleri arasında boşluk kaldırılması gerektiğini kabul ettim. Ben yok ()) .trim tam bir cevap b olmadığından a) Bu, başka çözümler üzerinde bir yorum olması gerektiğini işaret ediyordu değil neye ihtiyacınız başarmak için birden boşlukları kaldırın.
Ryan Leonard

1
Gerçekten haklısın ... Hızlı yorumum için özür dilerim ... Aradaki boşlukları kaldırmaz ... s.trim (). Değiştir (/ + / g, "") yoksa bir şey gerekli olurdu sınıflar arasındaki tüm birden çok boşluğu kaldırmak için .. Bunun yanında, el.classList hemen hemen yaygın olarak desteklenir, sanırım tüm sabit .. ..
DutchKevv

1
hiç sorun değil. Mutlu bir şekilde kaldırıldı, .classListçok daha temiz bir yaklaşım!
Ryan Leonard


3

Bu da size yardımcı olabilir. Ben childern element sınıflarını almak için bu fonksiyonu kullandım ..

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

Sizin durumunuzda doler_ipsum sınıfını istediğiniz gibi yapabilirsiniz calsses[2];.


2

Bunun için teşekkürler - ben benzer bir sorun yaşıyordu, ben programlı ilişkilendirmek çalışıyorum gibi hiyerarşik sınıf isimleri nesneleri, bu isimler benim komut dosyası tarafından bilinmesine rağmen.

Komut dosyamda, bir <a>etiketi, <a>etiket [some_class]artı sınıfını vererek yardım metnini açıp kapatmak için toggleve ardından yardım metnini sınıf olarak vererek istiyorum [some_class]_toggle. Bu kod, jQuery kullanarak ilgili öğeleri başarıyla buluyor:

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

Teşekkürler Alan, benzer bir şey yapıyorum, bunu yapmanın daha basit bir yolu olmadığına şaşırdım.
Eric Kigathi

- 1 - tl; dr, doğrudan soruyla ilgili olmayan bir tanjantla gider.
Mark Amery

2

Bunu dene. Bu size belgenin tüm öğelerinden tüm sınıfların adlarını verecektir.

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

});

İşte çalışma örneği: https://jsfiddle.net/raju_sumit/2xu1ujoy/3/


1

Benzer bir sorun vardı, tip görüntü öğesi için. Öğenin belirli bir sınıfta olup olmadığını kontrol etmem gerekiyordu. Önce denedim:

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

ama hoş bir "bu işlev bu öğe için mevcut değil" var.

Sonra öğemi DOM Gezgini'nde inceledim ve kullanabileceğim çok güzel bir özellik gördüm: className. Boş öğelerle ayrılmış öğemin tüm sınıflarının adlarını içeriyordu.

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

Bunu aldıktan sonra, dizeyi her zamanki gibi bölün.

Benim durumumda bu çalıştı:

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

Bunun diğer tür öğelerle (img dışında) çalışacağını varsayıyorum.

Umarım yardımcı olur.


0

javascript, dom'daki bir düğüm öğesi için bir classList özniteliği sağlar. Sadece

  element.classList

bir form nesnesi döndürür

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

Nesnenin kullanabileceğiniz içerir, ekle, kaldır gibi işlevleri vardır


Sizden 3 yıl önce gönderilmiş olan stackoverflow.com/a/5457148/1709587 alt kopyası ; -1.
Mark Amery

-3

Biraz geç, ancak expand () işlevini kullanmak herhangi bir öğede "hasClass ()" çağırmanıza izin verir, örneğin:
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);

10
Soru bu değildi.
Tomas

5
Ayrıca, jQuery, 1.2 sürümünden beri yerleşik olarak bu işleve sahiptir.
Andrew

-3

Soru, Jquery'nin ne yapmak için tasarlandığıdır.

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

Ve neden kimse cevap olarak .find () vermedi?

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

IE olmayan tarayıcılar için classList de vardır:

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

3
- 1; diğer sorunların yanı sıra, ilk iki kod snippet'iniz sorulan soru ile ilgisizdir ve son snippet'iniz bir sözdizimi hatasıdır.
Mark Amery

-4

İşte buradasınız , tüm sınıfların bir dizisini döndürmek için readsquare'in cevabını ayarladınız :

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

Bir jQuery öğesini işleve iletin, böylece örnek bir çağrı olacaktır:

var myClasses = classList($('#myElement'));

3
Neden classList dizisi üzerinden yineleme yapar, tüm öğeleri classes dizisine ekler ve classes dizisini döndürür? Sadece classList'i döndürmek aynı numarayı yapmalı, değil mi?
Martijn

Hayır! Aynı öğe için birçok sınıfın olduğu bir duruma değiniyoruz. Çok kolay olsaydı, biz bu konuda burada
değildik

8
Bu iş parçacığı, sınıfların bir listesini döndürmeyle ilgilidir ve sadece döndürmek $(elem).attr('class').split(/\s+/)bunu yapar. Belki yanlış anlıyorum, ama bir koleksiyonu yinelemek, içeriği yeni bir koleksiyona kopyalamak ve yeni koleksiyonu geri döndürmek için herhangi bir neden görmüyorum.
Martijn

-4

Bunun eski bir soru olduğunu biliyorum ama yine de.

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

var className=".dolor_spec" //dynamic

Elemanı değiştirmek istiyorsanız

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

Öğenin sınıfı olup olmadığını kontrol etmek istiyorsanız

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

birden fazla sınıf varsa

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

1
Bu parçacıkların hiçbiri sorulan soruya hiç cevap vermez; -1.
Mark Amery
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.