Làm thế nào để phân biệt giữa nhấp chuột đơn và nhấp đúp trên một và cùng một phần tử?
Nếu bạn không cần phải kết hợp chúng, bạn có thể dựa vào click
và dblclick
và mỗi thứ sẽ thực hiện công việc tốt.
Một vấn đề nảy sinh khi cố gắng kết hợp chúng: một dblclick
sự kiện sẽ thực sự kích hoạt một click
sự kiện , vì vậy bạn cần xác định xem một nhấp chuột duy nhất là nhấp chuột đơn "độc lập" hay là một phần của nhấp chuột đúp.
Ngoài ra: bạn không nên sử dụng cả hai click
và dblclick
trên một và cùng một phần tử :
Không thể cố gắng liên kết các trình xử lý với cả sự kiện nhấp chuột và dblclick cho cùng một phần tử. Chuỗi sự kiện được kích hoạt thay đổi giữa các trình duyệt, với một số nhận được hai sự kiện nhấp chuột trước dblclick và những sự kiện khác chỉ một. Độ nhạy của nhấp đúp (thời gian tối đa giữa các nhấp chuột được phát hiện là nhấp đúp) có thể khác nhau tùy theo hệ điều hành và trình duyệt và thường do người dùng định cấu hình.
Nguồn: https://api.jquery.com/dblclick/
Bây giờ đến tin tốt:
Bạn có thể sử dụng thuộc tính của sự kiện detail
để phát hiện số lượng nhấp chuột liên quan đến sự kiện. Điều này làm cho nhấp đúp vào bên trongclick
khá dễ phát hiện.
Vấn đề vẫn là phát hiện các nhấp chuột đơn lẻ và liệu chúng có phải là một phần của nhấp chuột kép hay không. Vì vậy, chúng tôi quay lại sử dụng bộ hẹn giờ vàsetTimeout
.
Kết hợp tất cả lại với nhau, với việc sử dụng thuộc tính dữ liệu (để tránh biến toàn cục) và không cần tự tính số lần nhấp, chúng tôi nhận được:
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>
Bản giới thiệu:
JSfiddle
Lưu ý về khả năng truy cập và tốc độ nhấp đúp:
- Như Wikipedia đặt nó "Độ trễ tối đa cần thiết cho hai lần nhấp chuột liên tiếp được hiểu là một lần nhấp đúp không được chuẩn hóa."
- Không có cách nào để phát hiện tốc độ nhấp đúp của hệ thống trong trình duyệt.
- Có vẻ mặc định là 500 ms và phạm vi 100-900mms trên Windows ( nguồn )
- Hãy nghĩ đến những người khuyết tật đặt tốc độ nhấp đúp trong cài đặt hệ điều hành của họ ở mức chậm nhất.
- Nếu tốc độ nhấp đúp của hệ thống chậm hơn 500 ms mặc định của chúng tôi ở trên, thì cả hành vi nhấp một lần và nhấp đúp đều sẽ được kích hoạt.
- Hoặc không sử dụng dựa vào kết hợp nhấp chuột đơn và nhấp đúp vào một và cùng một mục.
- Hoặc: thêm cài đặt trong các tùy chọn để có khả năng tăng giá trị.
Phải mất một lúc để tìm ra giải pháp thỏa mãn, tôi hy vọng điều này sẽ hữu ích!