Bagaimana cara membedakan antara klik tunggal dan klik ganda pada satu elemen yang sama?
Jika Anda tidak perlu mencampurnya, Anda dapat mengandalkan click
dandblclick
dan masing-masing akan melakukan pekerjaan dengan baik.
Masalah muncul saat mencoba mencampurnya: suatu dblclick
peristiwa sebenarnya akan memicu suatu click
peristiwa juga , sehingga Anda perlu untuk menentukan apakah satu klik adalah "berdiri sendiri" satu klik, atau bagian dari klik dua kali.
Selain itu: Anda tidak boleh menggunakan keduanya click
dan dblclick
pada satu elemen yang sama :
Tidak disarankan untuk mengikat penangan ke kejadian click dan dblclick untuk elemen yang sama. Urutan peristiwa yang dipicu bervariasi dari browser ke browser, dengan beberapa menerima dua peristiwa klik sebelum dblclick dan yang lainnya hanya satu. Sensitivitas klik dua kali (waktu maksimum antara klik yang dideteksi sebagai klik dua kali) dapat bervariasi menurut sistem operasi dan browser, dan seringkali dapat dikonfigurasi oleh pengguna.
Sumber: https://api.jquery.com/dblclick/
Sekarang kabar baiknya:
Anda dapat menggunakan detail
properti acara untuk mendeteksi jumlah klik yang terkait dengan acara tersebut. Ini membuat klik dua kali di dalamclick
cukup mudah untuk dideteksi.
Masalahnya tetap mendeteksi klik tunggal dan apakah itu bagian dari klik ganda atau bukan. Untuk itu, kami kembali menggunakan timer dansetTimeout
.
Membungkus semuanya, dengan menggunakan atribut data (untuk menghindari variabel global) dan tanpa perlu menghitung klik sendiri, kita mendapatkan:
HTML:
<div class="clickit" style="font-size: 200%; margin: 2em; padding: 0.25em; background: orange;">Double click me</div>
<div id="log" style="background: #efefef;"></div>
JavaScript:
<script>
var clickTimeoutID;
$( document ).ready(function() {
$( '.clickit' ).click( function( event ) {
if ( event.originalEvent.detail === 1 ) {
$( '#log' ).append( '(Event:) Single click event received.<br>' );
/** Is this a true single click or it it a single click that's part of a double click?
* The only way to find out is to wait it for either a specific amount of time or the `dblclick` event.
**/
clickTimeoutID = window.setTimeout(
function() {
$( '#log' ).append( 'USER BEHAVIOR: Single click detected.<br><br>' );
},
500 // how much time users have to perform the second click in a double click -- see accessibility note below.
);
} else if ( event.originalEvent.detail === 2 ) {
$( '#log' ).append( '(Event:) Double click event received.<br>' );
$( '#log' ).append( 'USER BEHAVIOR: Double click detected.<br>' );
window.clearTimeout( clickTimeoutID ); // it's a dblclick, so cancel the single click behavior.
} // triple, quadruple, etc. clicks are ignored.
});
});
</script>
Demo:
JSfiddle
Catatan tentang aksesibilitas dan kecepatan klik dua kali:
- Seperti yang dikatakan Wikipedia, "Penundaan maksimum yang diperlukan untuk dua klik berturut-turut untuk ditafsirkan sebagai klik dua kali tidak distandarkan."
- Tidak ada cara untuk mendeteksi kecepatan klik dua kali sistem di browser.
- Tampaknya defaultnya adalah 500 ms dan kisaran 100-900mm di Windows ( sumber )
- Pikirkan orang-orang dengan disabilitas yang menyetel, dalam pengaturan OS mereka, kecepatan klik ganda ke yang paling lambat.
- Jika kecepatan klik ganda sistem lebih lambat dari kecepatan default kami yang 500 md di atas, perilaku klik tunggal dan ganda akan dipicu.
- Baik tidak menggunakan mengandalkan gabungan klik tunggal dan ganda pada satu dan item yang sama.
- Atau: tambahkan pengaturan dalam opsi untuk memiliki kemampuan untuk meningkatkan nilai.
Butuh beberapa saat untuk menemukan solusi yang memuaskan, saya harap ini membantu!