Menggunakan JavaScript biasa (bukan jQuery), Apakah ada cara untuk memeriksa apakah suatu elemen mengandung kelas?
Saat ini, saya melakukan ini:
var test = document.getElementById("test");
var testClass = test.className;
switch (testClass) {
case "class1":
test.innerHTML = "I have class1";
break;
case "class2":
test.innerHTML = "I have class2";
break;
case "class3":
test.innerHTML = "I have class3";
break;
case "class4":
test.innerHTML = "I have class4";
break;
default:
test.innerHTML = "";
}
<div id="test" class="class1"></div>
Masalahnya adalah bahwa jika saya mengubah HTML ke ...
<div id="test" class="class1 class5"></div>
... tidak ada lagi yang sama persis, jadi saya mendapatkan output default nothing ( ""
). Tapi aku masih ingin output menjadi I have class1
karena <div>
masih mengandung satu .class1
kelas.
javascript
html
css
dom
daGUY
sumber
sumber
Jawaban:
Gunakan metode:
element.classList
.contains
Ini berfungsi pada semua browser saat ini dan ada juga polyfill untuk mendukung browser lama.
Atau , jika Anda bekerja dengan browser yang lebih lama dan tidak ingin menggunakan polyfill untuk memperbaikinya, menggunakan
indexOf
itu benar, tetapi Anda harus sedikit mengubahnya:Kalau tidak, Anda juga akan mendapatkan
true
jika kelas yang Anda cari adalah bagian dari nama kelas lain.DEMO
jQuery menggunakan metode yang serupa (jika tidak sama).
Diterapkan pada contoh:
Karena ini tidak bekerja bersama dengan pernyataan switch, Anda dapat mencapai efek yang sama dengan kode ini:
Ini juga kurang berlebihan;)
sumber
div
memiliki dua kelas tetapi hanya akan menghasilkanI have class1
seperti yang Anda gunakanbreak
. Jika Anda ingin menampilkan setiap kelas yang dimiliki elemen, maka Anda bisa mengambilclassName
dan membaginya di ruang putih. Atau apa tujuan Anda yang sebenarnya?Solusi mudah dan efektif adalah mencoba metode .contains .
sumber
contains
metode darielement.classList
propertiDi browser modern, Anda bisa menggunakan
contains
metodeElement.classList
:Demo
Browser yang didukung
(dari CanIUse.com )
Polyfill
Jika Anda ingin menggunakan
Element.classList
tetapi Anda juga ingin mendukung browser yang lebih lama, pertimbangkan untuk menggunakan polyfill ini oleh Eli Gray .sumber
Karena dia ingin menggunakan sakelar (), saya terkejut belum ada yang mengajukan ini:
sumber
Element.matches ()
element.matches (selectorString)
Menurut MDN Web Documents :
Oleh karena itu, Anda bisa menggunakan
Element.matches()
untuk menentukan apakah suatu elemen mengandung kelas.Lihat Kompatibilitas Browser
sumber
Ini sedikit cuplikan Jika Anda mencoba memeriksa apakah elemen berisi kelas, tanpa menggunakan jQuery.
Ini menjelaskan fakta bahwa elemen mungkin berisi beberapa nama kelas yang dipisahkan oleh ruang.
ATAU
Anda juga dapat menetapkan fungsi ini ke prototipe elemen.
Dan picu seperti ini (sangat mirip dengan
.hasClass()
fungsi jQuery ):sumber
Penumpang onlin yang disederhanakan: 1
1
indexOf
untuk array tidak didukung oleh IE (ofcourse). Ada banyak tambalan monyet yang dapat ditemukan di internet untuk itu.sumber
-
dianggap sebagai batas kata. Misalnya mencarifoo
dan kelas adalahfoo-bar
hasiltrue
.Ini agak lama, tetapi mungkin seseorang akan menemukan solusi saya bermanfaat:
sumber
className
hanyalah sebuah string sehingga Anda dapat menggunakan fungsi indexOf biasa untuk melihat apakah daftar kelas berisi string lain.sumber
class
pada contoh di atas?foo
pada elemen yang memilikifoobar
kelas.Saya tahu ada banyak jawaban tetapi sebagian besar untuk fungsi tambahan dan kelas tambahan. Ini yang saya gunakan secara pribadi; lebih bersih dan lebih sedikit baris kode!
sumber
<body class="category-page">
dandocument.body.className.match('page')
- akan cocok tetapi tidak ada kelas yangpage
melekat pada elemen\b
, misalnya/\bpage\b/g
, karena regex (catatan: harus digunakan/ /g
).Inilah solusi sepele yang case-insensitive:
sumber
Jika elemen hanya memiliki satu nama kelas, Anda dapat dengan cepat memeriksanya dengan mendapatkan atribut kelas. Jawaban lainnya jauh lebih kuat tetapi ini jelas memiliki kasus penggunaannya.
sumber
Saya telah membuat metode prototipe yang menggunakan
classList
, jika mungkin, resor lain untukindexOf
:Halaman uji
sumber
Trik Felix untuk menambahkan spasi untuk mengapit className dan string yang Anda cari adalah pendekatan yang tepat untuk menentukan apakah elemen memiliki kelas atau tidak.
Untuk memiliki perilaku yang berbeda sesuai dengan kelas, Anda dapat menggunakan referensi fungsi, atau fungsi, dalam peta:
sumber
Saya akan Poly mengisi fungsionalitas classList dan menggunakan sintaks baru. Dengan cara ini, browser yang lebih baru akan menggunakan implementasi baru (yang jauh lebih cepat) dan hanya browser lama yang akan membuat kinerja terpukul dari kode.
https://github.com/remy/polyfills/blob/master/classList.js
sumber
Ini agak salah, tetapi jika Anda memiliki acara yang memicu sakelar, Anda dapat melakukannya tanpa kelas:
Anda dapat melakukan
.replace(/[0-9]/g, '')
menghapus digit dariid
.Agak rumit, tetapi bekerja untuk sakelar panjang tanpa fungsi atau loop tambahan
sumber
Lihat tautan Codepen ini untuk cara memeriksa elemen yang lebih cepat dan mudah jika memiliki kelas tertentu menggunakan JavaScript vanilla ~!
hasClass (Vanilla JS)
sumber
Ini didukung pada IE8 +.
Pertama kita periksa apakah
classList
ada jika kita dapat menggunakancontains
metode yang didukung oleh IE10 +. Jika kita menggunakan IE9 atau 8, ia kembali menggunakan regex, yang tidak seefisien tetapi merupakan polyfill ringkas.Atau jika Anda sedang mengompilasi dengan babel Anda cukup menggunakan:
el.classList.contains(className);
sumber
Coba yang ini:
sumber
foo-bar
dan mencarifoo
.a-zA-Z0-9_
] sebagai karakter kata. Jadi untuk classnames mengandung char dikurangi ini tidak akan bekerja .Saya pikir solusi sempurna adalah ini
sumber
di elemen mana saat ini kelas '.bar'? Berikut ini solusi lain tetapi terserah Anda.
demo jsfiddle
Tentu saja ini hanya pencarian untuk 1 elemen sederhana
<img>
(/Image/g
) tetapi Anda dapat meletakkan semua dalam array seperti<li>
ini/LI/g
,<ul>
=/UL/g
dll.sumber
Hanya untuk menambah jawaban bagi orang yang mencoba menemukan nama kelas dalam elemen SVG sebaris.
Ubah
hasCLass()
fungsi menjadi:Alih-alih menggunakan
className
properti Anda harus menggunakangetAttribute()
metode untuk mengambil nama kelas.sumber
Saya membuat fungsi-fungsi ini untuk situs web saya, saya hanya menggunakan javascript vanilla, mungkin itu akan membantu seseorang. Pertama saya membuat fungsi untuk mendapatkan elemen HTML apa pun:
Kemudian fungsi yang menerima kelas untuk dihapus dan pemilih elemen:
Sekarang Anda dapat menggunakannya seperti ini:
Semoga ini bisa membantu.
sumber
Tip: Cobalah untuk menghapus dependensi jQuery di proyek Anda sebanyak yang Anda bisa - VanillaJS .
document.firstElementChild
mengembalikan<html>
tag laluclassList
atribut mengembalikan semua kelas yang ditambahkan padanya.sumber
Bagi saya cara yang paling elegan dan lebih cepat untuk mencapainya adalah:
sumber