Dalam sebuah forum Saya pernah sekali diajari mengenai cara tersingkat untuk menangani perintah-perintah JQuery di dalam peraturan kondisi yang biasa dituliskan seperti ini:
if (statement) {
$(selector).method1();
} else {
$(selector).method2();
}
Kode di bawah ini adalah jalan pintas untuk kondisional di atas:
$(selector)[statement ? "method1" : "method2"]();
Pada awalnya Saya merasa bingung dengan sudut pandang yang orang tersebut berikan, sampai kemudian Saya menyadari bahwa pada dasarnya ini hanyalah sebuah jalan pintas peraturan if/else untuk memanggil item objek yang berbeda berdasarkan kondisi tertentu.
JQuery, pada dasarnya hanyalah sekumpulan fungsi yang dinyatakan di dalam objek. Kurang lebihnya seperti ini (memang tidak sama persis seperti ini, tapi setidaknya lumayan mirip):
var foo = {
addClass: function(param) { ... },
removeClass: function(param) { ... },
toggleClass: function(param) { ... },
hasClass: function(param) { ... }
...
}
Sehingga setiap fungsi bisa dipanggil dengan cara seperti ini:
foo.addClass('bar');
foo.removeClass('bar');
Atau seperti ini:
foo["addClass"]('bar');
foo["removeClass"]('bar');
Katakanlah kita ingin memanggil fungsi tertentu di dalam foo
hanya jika suatu kondisi terpenuhi. Jika kondisi tidak terpenuhi, maka fungsi cadangan yang lain akan dijalankan:
if (abc === true) {
foo["removeClass"]('bar');
} else {
foo["addClass"]('bar');
}
Yang mana jika diubah ke pernyataan kondisional ringkas akan menjadi seperti ini:
var x = (abc === true) ? "removeClass" : "addClass";
foo[x]('bar');
Sehingga kita bisa menyimpulkannya menjadi seperti ini:
foo[abc === true ? "removeClass" : "addClass"]('bar');
Contoh Penerapan
Berikut ini adalah contoh penerapan kondisional jalan pintas untuk menangani perintah .slideDown()
dan .fadeOut()
berdasarkan visibilitas panel:
Sebelum
$('h2').click(function() {
$(this).toggleClass('active');
if ($(this).next().is(':hidden')) {
$(this).next().slideDown();
} else {
$(this).next().fadeOut();
}
});
Sesudah
$('h2').click(function() {
$(this).toggleClass('active')
.next()[$(this).next().is(':hidden') ? "slideDown" : "fadeOut"]();
});