Teknik HTML5 modern untuk mengubah kelas
Browser modern telah menambahkan classList yang menyediakan metode untuk membuatnya lebih mudah untuk memanipulasi kelas tanpa perlu perpustakaan:
document.getElementById("MyElement").classList.add('MyClass');
document.getElementById("MyElement").classList.remove('MyClass');
if ( document.getElementById("MyElement").classList.contains('MyClass') )
document.getElementById("MyElement").classList.toggle('MyClass');
Sayangnya, ini tidak berfungsi di Internet Explorer sebelum v10, meskipun ada shim untuk menambahkan dukungan untuk itu ke IE8 dan IE9, tersedia dari halaman ini . Namun, semakin banyak didukung .
Solusi lintas-browser sederhana
Cara standar JavaScript untuk memilih elemen menggunakan document.getElementById("Id")
, yang digunakan contoh-contoh berikut - Anda tentu saja dapat memperoleh elemen dengan cara lain, dan dalam situasi yang tepat dapat menggunakan this
saja - namun, memerinci hal ini berada di luar cakupan jawabannya.
Untuk mengubah semua kelas untuk suatu elemen:
Untuk mengganti semua kelas yang ada dengan satu atau lebih kelas baru, setel atribut className:
document.getElementById("MyElement").className = "MyClass";
(Anda dapat menggunakan daftar yang dibatasi ruang untuk menerapkan beberapa kelas.)
Untuk menambahkan kelas tambahan ke elemen:
Untuk menambahkan kelas ke elemen, tanpa menghapus / memengaruhi nilai yang ada, tambahkan spasi dan nama kelas baru, seperti:
document.getElementById("MyElement").className += " MyClass";
Untuk menghapus kelas dari suatu elemen:
Untuk menghapus satu kelas ke suatu elemen, tanpa mempengaruhi kelas potensial lainnya, diperlukan penggantian regex sederhana:
document.getElementById("MyElement").className =
document.getElementById("MyElement").className.replace
( /(?:^|\s)MyClass(?!\S)/g , '' )
/* Code wrapped for readability - above is all one statement */
Penjelasan dari regex ini adalah sebagai berikut:
(?:^|\s) # Match the start of the string, or any single whitespace character
MyClass # The literal text for the classname to remove
(?!\S) # Negative lookahead to verify the above is the whole classname
# Ensures there is no non-space character following
# (i.e. must be end of string or a space)
Itu g
bendera menceritakan ganti untuk mengulang seperti yang diperlukan, dalam hal nama kelas telah ditambahkan beberapa kali.
Untuk memeriksa apakah kelas sudah diterapkan ke elemen:
Regex yang sama yang digunakan di atas untuk menghapus kelas juga dapat digunakan sebagai pemeriksaan apakah kelas tertentu ada:
if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) )
Menetapkan tindakan ini untuk mengeklik acara:
Meskipun dimungkinkan untuk menulis JavaScript langsung di dalam atribut acara HTML (seperti onclick="this.className+=' MyClass'"
), ini bukan perilaku yang disarankan. Terutama pada aplikasi yang lebih besar, kode yang lebih dapat dikelola dicapai dengan memisahkan markup HTML dari logika interaksi JavaScript.
Langkah pertama untuk mencapai ini adalah dengan membuat fungsi, dan memanggil fungsi di atribut onclick, misalnya:
<script type="text/javascript">
function changeClass(){
// Code examples from above
}
</script>
...
<button onclick="changeClass()">My Button</button>
(Tidak perlu memiliki kode ini dalam tag skrip, ini hanya untuk singkatnya contoh, dan termasuk JavaScript dalam file yang berbeda mungkin lebih tepat.)
Langkah kedua adalah memindahkan acara onclick dari HTML dan ke JavaScript, misalnya menggunakan addEventListener
<script type="text/javascript">
function changeClass(){
// Code examples from above
}
window.onload = function(){
document.getElementById("MyElement").addEventListener( 'click', changeClass);
}
</script>
...
<button id="MyElement">My Button</button>
(Perhatikan bahwa bagian window.onload diperlukan agar konten fungsi tersebut dieksekusi setelah HTML selesai memuat - tanpa ini, MyElement mungkin tidak ada ketika kode JavaScript dipanggil, sehingga baris akan gagal.)
Kerangka dan Perpustakaan JavaScript
Kode di atas semuanya dalam JavaScript standar, namun itu adalah praktik umum untuk menggunakan kerangka kerja atau pustaka untuk menyederhanakan tugas-tugas umum, serta mendapat manfaat dari bug tetap dan kasus tepi yang mungkin tidak Anda pikirkan ketika menulis kode Anda.
Sementara beberapa orang menganggap itu berlebihan untuk menambahkan kerangka ~ 50 KB hanya untuk mengubah kelas, jika Anda melakukan sejumlah besar pekerjaan JavaScript, atau apa pun yang mungkin memiliki perilaku lintas-browser yang tidak biasa, ada baiknya mempertimbangkan.
(Secara kasar, perpustakaan adalah seperangkat alat yang dirancang untuk tugas tertentu, sementara kerangka kerja umumnya berisi beberapa perpustakaan dan melakukan serangkaian tugas lengkap.)
Contoh di atas telah direproduksi di bawah ini menggunakan jQuery , mungkin pustaka JavaScript yang paling umum digunakan (meskipun ada juga yang layak diselidiki).
(Perhatikan bahwa di $
sini adalah objek jQuery.)
Mengubah Kelas dengan jQuery:
$('#MyElement').addClass('MyClass');
$('#MyElement').removeClass('MyClass');
if ( $('#MyElement').hasClass('MyClass') )
Selain itu, jQuery menyediakan pintasan untuk menambahkan kelas jika tidak berlaku, atau menghapus kelas yang:
$('#MyElement').toggleClass('MyClass');
Menetapkan fungsi ke acara klik dengan jQuery:
$('#MyElement').click(changeClass);
atau, tanpa perlu id:
$(':button:contains(My Button)').click(changeClass);