Dapatkan daftar kelas untuk elemen dengan jQuery

657

Apakah ada cara di jQuery untuk mengulang atau menetapkan ke array semua kelas yang ditugaskan ke suatu elemen?

ex.

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

Saya akan mencari kelas "khusus" seperti pada "dolor_spec" di atas. Saya tahu bahwa saya bisa menggunakan hasClass () tetapi nama kelas yang sebenarnya mungkin belum diketahui pada saat itu.

Buggabill
sumber
Jika Anda tidak tahu nama kelas pada saat itu, mencegah Anda menggunakan hasClass (), bagaimana Anda ingin tahu yang mana di dalam array itu?
doomspork
Saya merancang formulir di mana saya melakukan validasi awal dengan jQuery. Saya menambahkan id elemen input ke daftar kelas div kesalahan jika ada yang dihasilkan. Saya kemudian memungkinkan untuk mengklik pada div kesalahan untuk memfokuskan elemen input yang salah. Script ini akan digunakan untuk lebih dari satu formulir. Karena itu saya tidak ingin kode keras id dalam skrip.
Buggabill
1
Benar, saya mengerti mengapa Anda tidak ingin hardcode. Tetapi jika Anda meluangkan waktu sejenak untuk melihat contoh redsquare Anda akan melihat Anda harus memasukkan hardcode 'someClass' ke dalam blok if. Bagaimanapun Anda bisa mencapai ini dengan variabel.
doomspork
Daripada menggunakan atribut kelas, Anda bisa memiliki variabel daftar kesalahan di dalam namespace Anda yang berisi referensi DOM ke elemen dengan kesalahan. Sehingga menghilangkan kebutuhan untuk menarik daftar atribut setiap kali, mengulanginya, menemukan elemen DOM, dan memfokuskannya.
doomspork

Jawaban:

732

Anda dapat menggunakan document.getElementById('divId').className.split(/\s+/);untuk memberi Anda array nama kelas.

Kemudian Anda dapat beralih dan menemukan yang Anda inginkan.

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

jQuery tidak benar-benar membantu Anda di sini ...

var classList = $('#divId').attr('class').split(/\s+/);
$.each(classList, function(index, item) {
    if (item === 'someClass') {
        //do something
    }
});
kotak merah
sumber
4
itulah yang saya lakukan, tetapi saya tidak yakin apakah ada fungsi build di jQuery yang memberi Anda koleksi kelas.
Sander
36
FYI: jQuery using className.split (/ \ s + /)
kͩeͣmͮpͥ ͩ
70
Tambahkan sendiri plugin jQuery:$.fn.classList = function() {return this[0].className.split(/\s+/);};
ripper234
1
atau kemudian Anda dapat: if ($.inArray("someclass",classList)>=0) { /* hasClass someclass*/ }
sambomartin
Bukan ahli javascript di sini. Bisakah Anda memberi tahu saya jika split (/ \ s + /) lebih baik daripada hanya melakukan split ("")? Ini berfungsi sama untuk saya di FF23 / Chrome28 / IE8.
Roberto Linares
288

Mengapa tidak ada yang terdaftar.

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

EDIT: Seperti yang ditunjukkan oleh @MarkAmery, Anda tidak bisa hanya .split(' ')karena nama kelas dapat dipisahkan oleh segala jenis spasi putih.

Dreamr OKelly
sumber
6
Itu adalah bagian dari jawaban yang diterima ... Saya membutuhkan semua kelas yang diterapkan pada suatu elemen.
Buggabill
54
Karena itu salah! Kelas dapat dipisahkan oleh spasi apa saja (mis. Anda dapat membungkus atribut kelas panjang dalam HTML Anda ke beberapa baris), tetapi jawaban ini gagal menjelaskannya. Coba tempelkan $('<div class="foo bar baz">').attr("class").split(' ')ke konsol browser Anda (ada karakter tab di sana); Anda akan mendapatkan ["foo", "bar baz"]alih-alih daftar kelas yang benar ["foo", "bar", "baz"].
Mark Amery
2
@MarkAmery benar. Jika Anda ingin class="foo <lots of spaces here> bar", Anda akan berakhir dengan array dengan elemen string kosong.
Jacob van Lingen
4
Saya pikir dalam 99% kasus solusi ini efektif, yaitu memberikan Anda mengendalikan HTML. Saya tidak dapat memikirkan alasan apa pun yang kami perlukan untuk mendukung kemungkinan tab atau beberapa spasi di antara nama kelas bahkan jika standar HTML mengizinkannya.
Gordon Rouse
5
@GordonRouse ruang ekstra yang merayap ke dalam daftar kelas cukup umum, terutama jika beberapa jenis logika menulis daftar kelas.
Eric
142

Pada browser pendukung, Anda dapat menggunakan classListproperti elemen DOM .

$(element)[0].classList

Ini adalah objek mirip array yang mencantumkan semua kelas yang dimiliki elemen.

Jika Anda perlu mendukung versi browser lama yang tidak mendukung classListproperti, halaman MDN tertaut juga menyertakan shim untuk itu - meskipun bahkan shim tidak akan bekerja pada versi Internet Explorer di bawah IE 8.

Pehmolelu
sumber
Bersihkan jawaban dan tidak menemukan kembali roda.
Marco Sulla
@ Marsco Sulla: ini memang memiliki kekurangan selain dukungan pada perangkat lunak usang. .classListbukan array yang benar, dan metode seperti .indexOf(⋯)itu tidak berfungsi. Ini hanya "objek seperti array", sedangkan .className.split(/\s+/).indexOf(⋯)(dari jawaban yang diterima) berfungsi.
Incnis Mrsi
Anda dapat dengan mudah mengonversi setiap iterable menjadi Arraymenggunakan [...iterable]atauArray.from(iterable)
Marco Sulla
142

Ini adalah plugin jQuery yang akan mengembalikan array dari semua kelas yang dimiliki elemen yang cocok

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

Gunakan seperti

$('div').classes();

Dalam kasus Anda kembali

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

Anda juga dapat melewatkan fungsi ke metode yang akan dipanggil pada setiap kelas

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

Ini adalah jsFiddle yang saya atur untuk menunjukkan dan menguji http://jsfiddle.net/GD8Qn/8/

Javascript yang diperkecil

;!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);
Akan
sumber
Sangat cocok untuk FullCalendar saat menyalin kelas ke atribut className dari suatu Acara.
Dan Power
78

Anda harus mencoba yang ini:

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

Ini mengembalikan array dari semua kelas elemen saat ini.

P.Petkov
sumber
ini jauh lebih rapi daripada jawaban yang diterima, apakah ada alasan untuk tidak menggunakan metode ini?
RozzA
5
Ya saya tidak tahu. Tetapi ini adalah cara yang tepat untuk mendapatkan properti dari elemen DOM. Dan "classList" adalah properti yang memberi Anda berbagai kelas css yang diterapkan pada elemen.
P.Petkov
@RozzA Mungkin saat itu tidak tersedia? Tapi saya akan mengatakan ini adalah metode yang paling tepat untuk saat ini, kecuali jika Anda tidak menggunakan jQuery, di mana yang sederhana .classListadalah solusinya - Anda hanya perlu memperhatikan inkonsistensi dan / atau dukungan browser yang hilang ..
Dennis98
@ Dennis98 panggilan yang bagus, kadang-kadang saya lupa seberapa cepat fitur baru keluar. Saya juga telah melakukan js sederhana .classListyang berfungsi cukup baik di browser modern
RozzA
1
Perhatikan bahwa classListproperti tidak berfungsi pada IE 10/11 untuk elemen SVG (meskipun berfungsi untuk elemen HTML). Lihat 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

});
Carlisle
sumber
7

Memperbarui:

Seperti yang ditunjukkan oleh @Ryan Leonard dengan benar, jawaban saya tidak benar-benar memperbaiki poin yang saya buat sendiri ... Anda harus memotong dan menghapus spasi ganda dengan (misalnya) string.replace (/ + / g, "") .. Atau Anda dapat memisahkan el.className dan kemudian menghapus nilai kosong dengan (misalnya) arr.filter (Boolean).

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

atau lebih modern

const classes = element.classList;

Tua:

Dengan semua jawaban yang diberikan, Anda tidak boleh lupa untuk pengguna .trim () (atau $ .trim ())

Karena kelas ditambahkan dan dihapus, dapat terjadi bahwa ada beberapa spasi di antara string kelas .. misalnya 'class1 class2 class3' ..

Ini akan berubah menjadi ['class1', 'class2', '', '', '', 'class3'] ..

Saat Anda menggunakan trim, semua banyak ruang dihapus ..

DutchKevv
sumber
2
Ini salah (dan bukan jawaban). Baik String.trim () dan $ .trim () menghapus semua spasi putih depan dan akhir, dan biarkan senar lainnya. jsconsole.com /?% 22% 20% 20a% 20% 20b% 20% 20% 22.trim ()
Ryan Leonard
Apakah Anda sudah melihat jawabannya? Semua solusi JS asli tidak memeriksa memimpin dan mengikuti spasi putih, sehingga memberikan daftar kelas yang salah, karena akan ada kelas kosong dalam array .. jQuery melakukan hal yang sama secara internal dengan trim ketika membaca kelas
DutchKevv
2
Saya memang melihat jawaban lain, dan setuju bahwa spasi putih harus dihapus antara nama kelas. Saya menunjukkan bahwa a) ini harus menjadi komentar pada solusi lain, karena itu bukan jawaban lengkap b) .trim () tidak menghapus banyak spasi untuk mencapai apa yang Anda butuhkan.
Ryan Leonard
1
Anda benar-benar benar ... Maaf atas komentar saya yang cepat .. Tidak menghapus spasi di antara ... s.trim (). Ganti (/ + / g, "") atau sesuatu akan diperlukan untuk menghapus semua banyak ruang di antara kelas .. Di samping itu, el.classList hampir didukung secara luas, memperbaiki semua yang saya kira ..
DutchKevv
1
tidak ada masalah sama sekali. Dengan senang hati dipilih, .classListadalah pendekatan yang jauh lebih bersih!
Ryan Leonard
7
$('div').attr('class').split(' ').each(function(cls){ console.log(cls);})
alexche8
sumber
2
Ini adalah penyalahgunaan yang mengerikan .map; gunakan .eachjika Anda tidak perlu .mapnilai pengembalian. Membagi spasi daripada spasi putih juga rusak - lihat komentar saya di stackoverflow.com/a/10159062/1709587 . Bahkan jika tidak ada dari poin-poin ini yang benar, ini tidak menambahkan apa pun yang baru ke halaman. -1!
Mark Amery
3

Mungkin ini dapat membantu Anda juga. Saya telah menggunakan fungsi ini untuk mendapatkan kelas elemen childern ..

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

Dalam kasus Anda, Anda ingin kelas doler_ipsum yang dapat Anda lakukan seperti ini sekarang calsses[2];.

Phoenix
sumber
2

Terima kasih untuk ini - saya mengalami masalah yang sama, karena saya mencoba menghubungkan objek secara terprogram akan nama-nama kelas hierarkis, meskipun nama-nama itu mungkin tidak diketahui oleh skrip saya.

Dalam skrip saya, saya ingin <a>tag untuk mengaktifkan / menonaktifkan teks bantuan dengan memberikan <a>tag [some_class]plus kelasnya toggle, dan kemudian memberikan teks bantuannya kelas [some_class]_toggle. Kode ini berhasil menemukan elemen terkait menggunakan 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");}
    }
    });
} 
Alan L.
sumber
Terima kasih Alan, saya melakukan hal yang serupa, saya terkejut bahwa tidak ada cara yang lebih sederhana untuk melakukan ini.
Eric Kigathi
- 1 - tl; dr, berbunyi garis singgung yang tidak secara langsung relevan dengan pertanyaan.
Mark Amery
2

Coba ini. Ini akan memberi Anda nama semua kelas dari semua elemen dokumen.

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

});

Berikut ini contoh kerjanya: https://jsfiddle.net/raju_sumit/2xu1ujoy/3/

Sumit Raju
sumber
1

Saya punya masalah serupa, untuk elemen tipe gambar. Saya perlu memeriksa apakah elemen itu dari kelas tertentu. Pertama saya mencoba dengan:

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

tapi saya mendapat "fungsi ini tidak tersedia untuk elemen ini".

Kemudian saya memeriksa elemen saya di DOM explorer dan saya melihat atribut yang sangat bagus yang bisa saya gunakan: className. Isinya nama semua kelas elemen saya yang dipisahkan oleh spasi kosong.

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

Setelah Anda mendapatkannya, cukup pisahkan string seperti biasa.

Dalam kasus saya ini berhasil:

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

Saya berasumsi ini akan bekerja dengan jenis elemen lain (selain img).

Semoga ini bisa membantu.

eva
sumber
0

javascript menyediakan atribut classList untuk elemen simpul di dom. Cukup menggunakan

  element.classList

akan mengembalikan objek bentuk

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

Objek memiliki fungsi seperti berisi, menambah, menghapus yang dapat Anda gunakan

Anuj J
sumber
Duplikasi inferior stackoverflow.com/a/5457148/1709587 yang diposting 3 tahun sebelum Anda; -1.
Mark Amery
-3

Agak terlambat, tetapi menggunakan fungsi extended () memungkinkan Anda memanggil "hasClass ()" pada elemen apa pun, misalnya:
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);
gesellix
sumber
10
Bukan itu pertanyaannya.
Tomas
5
Selain itu, jQuery telah memiliki fungsi ini sejak versi 1.2.
Andrew
-3

Pertanyaannya adalah apa yang dirancang untuk dilakukan Jquery.

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

Dan mengapa tidak ada yang memberikan .find () sebagai jawaban?

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

Ada juga classList untuk browser non-IE:

if element.classList.contains("dolor_spec") {  //do stuff
john ktejik
sumber
3
- 1; di antara masalah lain, dua cuplikan kode pertama Anda tidak terkait dengan pertanyaan yang diajukan dan cuplikan terakhir Anda adalah kesalahan sintaksis.
Mark Amery
-4

Ini dia, hanya tweak jawaban readsquare untuk mengembalikan array semua kelas:

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

Lewati elemen jQuery ke fungsi, sehingga panggilan sampel adalah:

var myClasses = classList($('#myElement'));
Gregra
sumber
3
Mengapa beralih melalui array classList, tambahkan semua elemen ke array kelas dan kembalikan array kelas? Hanya mengembalikan classList harus melakukan trik yang sama, bukan?
Martijn
Nggak. Karena kita mengacu pada situasi di mana ada banyak kelas untuk elemen yang sama. Jika itu sangat mudah, kami tidak di sini di utas ini :)
Gregra
8
Utas ini adalah tentang mengembalikan daftar kelas, dan hanya mengembalikannya $(elem).attr('class').split(/\s+/). Mungkin saya salah, tetapi saya tidak melihat alasan untuk beralih melalui koleksi, menyalin konten ke koleksi baru dan mengembalikan koleksi baru itu.
Martijn
-4

Saya tahu ini adalah pertanyaan lama tapi tetap saja.

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

var className=".dolor_spec" //dynamic

Jika Anda ingin memanipulasi elemen

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

Jika Anda ingin memeriksa apakah elemen memiliki kelas

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

jika banyak kelas

//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
dulebov.artem
sumber
1
Tidak ada cuplikan ini yang menjawab pertanyaan yang diajukan sama sekali; -1.
Mark Amery