Anda tidak dapat menonaktifkan tautan (dengan cara portabel). Anda dapat menggunakan salah satu teknik ini (masing-masing dengan kelebihan dan kekurangannya sendiri).
Cara CSS
Ini harus menjadi cara yang benar (tetapi lihat nanti) untuk melakukannya ketika sebagian besar browser akan mendukungnya:
a.disabled {
pointer-events: none;
}
Itu yang, misalnya, Bootstrap 3.x lakukan. Saat ini (2016) hanya didukung oleh Chrome, FireFox, dan Opera (19+). Internet Explorer mulai mendukung ini dari versi 11 tetapi tidak untuk tautan namun tersedia di elemen luar seperti:
span.disable-links {
pointer-events: none;
}
Dengan:
<span class="disable-links"><a href="#">...</a></span>
Penanganan masalah
Kami, mungkin, kebutuhan untuk mendefinisikan kelas CSS untuk pointer-events: none
tetapi bagaimana jika kita menggunakan kembali dengan disabled
atribut bukan kelas CSS? Sebenarnya disabled
tidak didukung untuk <a>
tetapi browser tidak akan mengeluh untuk atribut yang tidak diketahui . Menggunakan disabled
atribut IE akan mengabaikan pointer-events
tetapi akan menghormati disabled
atribut spesifik IE ; browser yang sesuai dengan CSS lainnya akan mengabaikan atribut dan kehormatan yang tidak diketahui . Lebih mudah menulis daripada menjelaskan:disabled
pointer-events
a[disabled] {
pointer-events: none;
}
Opsi lain untuk IE 11 adalah mengatur display
elemen tautan ke block
atau inline-block
:
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
Perhatikan bahwa ini mungkin solusi portabel jika Anda perlu mendukung IE (dan Anda dapat mengubah HTML) tetapi ...
Semua ini mengatakan harap dicatat bahwa pointer-events
menonaktifkan hanya ... acara pointer. Tautan masih dapat dinavigasi melalui keyboard maka Anda juga perlu menerapkan salah satu teknik lain yang dijelaskan di sini.
Fokus
Sehubungan dengan teknik CSS yang dijelaskan di atas, Anda dapat menggunakan tabindex
cara yang tidak standar untuk mencegah elemen menjadi terfokus:
<a href="#" disabled tabindex="-1">...</a>
Saya tidak pernah memeriksa kompatibilitasnya dengan banyak browser maka Anda mungkin ingin mengujinya sendiri sebelum menggunakan ini. Ini memiliki keuntungan untuk bekerja tanpa JavaScript. Sayangnya (tapi jelas) tabindex
tidak dapat diubah dari CSS.
Mencegah klik
Gunakan href
fungsi a to JavaScript, periksa kondisinya (atau atribut yang dinonaktifkan itu sendiri) dan jangan lakukan apa-apa.
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
Untuk menonaktifkan tautan, lakukan ini:
$("td > a").attr("disabled", "disabled");
Untuk mengaktifkannya kembali:
$("td > a").removeAttr("disabled");
Jika Anda ingin, alih-alih .is("[disabled]")
Anda dapat menggunakan .attr("disabled") != undefined
(jQuery 1.6+ akan selalu kembali undefined
ketika atribut tidak disetel) tetapi is()
jauh lebih jelas (terima kasih kepada Dave Stewart untuk tip ini). Harap dicatat di sini saya menggunakan disabled
atribut dengan cara yang tidak standar, jika Anda peduli dengan ini, maka ganti atribut dengan kelas dan ganti .is("[disabled]")
dengan .hasClass("disabled")
(menambah dan menghapus dengan addClass()
dan removeClass()
).
Zoltán Tamási mencatat dalam komentar bahwa "dalam beberapa kasus acara klik sudah terikat dengan beberapa fungsi" nyata "(misalnya menggunakan knockoutjs). Dalam hal ini, penangan event handler dapat menyebabkan beberapa masalah. Karenanya saya menerapkan tautan yang dinonaktifkan dengan mengikat pengembalian handler palsu ke tautan touchstart
, mousedown
dan keydown
acara. Ada beberapa kelemahan (ini akan mencegah pengguliran sentuh dimulai pada tautan) " tetapi menangani acara keyboard juga memiliki manfaat untuk mencegah navigasi keyboard.
Perhatikan bahwa jika href
tidak dihapus, mungkin pengguna dapat mengunjungi halaman itu secara manual.
Kosongkan tautannya
Hapus href
atributnya. Dengan kode ini Anda tidak menambahkan pengendali acara tetapi Anda mengubah tautannya sendiri. Gunakan kode ini untuk menonaktifkan tautan:
$("td > a").each(function() {
this.data("href", this.attr("href"))
.attr("href", "javascript:void(0)")
.attr("disabled", "disabled");
});
Dan ini untuk mengaktifkannya kembali:
$("td > a").each(function() {
this.attr("href", this.data("href")).removeAttr("disabled");
});
Secara pribadi saya tidak terlalu menyukai solusi ini (jika Anda tidak perlu berbuat lebih banyak dengan tautan yang dinonaktifkan) tetapi mungkin lebih kompatibel karena berbagai cara untuk mengikuti tautan.
Penangan klik palsu
Tambah / hapus onclick
fungsi tempat Anda return false
, tautan tidak akan diikuti. Untuk menonaktifkan tautan:
$("td > a").attr("disabled", "disabled").on("click", function() {
return false;
});
Untuk mengaktifkannya kembali:
$("td > a").removeAttr("disabled").off("click");
Saya tidak berpikir ada alasan untuk memilih solusi ini daripada yang pertama.
Styling
Styling bahkan lebih sederhana, solusi apa pun yang Anda gunakan untuk menonaktifkan tautan yang kami tambahkan disabled
atribut sehingga Anda dapat menggunakan aturan CSS berikut:
a[disabled] {
color: gray;
}
Jika Anda menggunakan kelas alih-alih atribut:
a.disabled {
color: gray;
}
Jika Anda menggunakan kerangka UI, Anda mungkin melihat bahwa tautan yang dinonaktifkan tidak ditata dengan benar. Bootstrap 3.x, misalnya, menangani skenario ini dan tombolnya ditata dengan benar baik dengan disabled
atribut maupun dengan .disabled
kelas. Sebaliknya, jika Anda menghapus tautan (atau menggunakan salah satu teknik JavaScript lainnya), Anda juga harus menangani gaya karena <a>
tanpanya href
masih dicat sebagaimana diaktifkan.
Aplikasi Internet Kaya yang Dapat Diakses (ARIA)
Jangan lupa juga menyertakan atribut aria-disabled="true"
bersamaan dengan disabled
atribut / kelas.