จะแยกความแตกต่างระหว่างการคลิกครั้งเดียวและการคลิกสองครั้งในองค์ประกอบเดียวและองค์ประกอบเดียวกันได้อย่างไร
หากคุณไม่จำเป็นต้องผสมคุณสามารถพึ่งพาclick
และdblclick
และแต่ละคนจะทำผลงานได้ดี
ปัญหาที่เกิดขึ้นเมื่อพยายามที่จะนำมาผสม: เหตุการณ์จริงจะเรียกเหตุการณ์เช่นกันdblclick
click
ดังนั้นคุณจึงจำเป็นต้องตรวจสอบว่ามีการคลิกเพียงครั้งเดียวคือ "สแตนด์อะโลน" คลิกเพียงครั้งเดียวหรือเป็นส่วนหนึ่งของการดับเบิลคลิก
นอกจากนี้: คุณไม่ควรใช้ทั้งสองclick
และdblclick
ที่หนึ่งและองค์ประกอบเดียวกัน :
ไม่สามารถเชื่อมโยงตัวจัดการกับทั้งเหตุการณ์คลิกและ dblclick สำหรับองค์ประกอบเดียวกันได้ ลำดับของเหตุการณ์ที่เรียกใช้จะแตกต่างกันไปในแต่ละเบราว์เซอร์โดยที่บางเหตุการณ์ได้รับสองเหตุการณ์คลิกก่อน dblclick และอื่น ๆ เพียงเหตุการณ์เดียว ความไวในการคลิกสองครั้ง (เวลาสูงสุดระหว่างการคลิกที่ตรวจพบว่าเป็นการดับเบิลคลิก) อาจแตกต่างกันไปตามระบบปฏิบัติการและเบราว์เซอร์และมักจะกำหนดค่าได้โดยผู้ใช้
ที่มา: https://api.jquery.com/dblclick/
ตอนนี้ไปที่ข่าวดี:
คุณสามารถใช้detail
คุณสมบัติของเหตุการณ์เพื่อตรวจหาจำนวนคลิกที่เกี่ยวข้องกับเหตุการณ์ ทำให้คลิกสองครั้งภายในclick
ตรวจจับค่อนข้างง่าย
ปัญหายังคงอยู่ที่การตรวจจับการคลิกเพียงครั้งเดียวและไม่ว่าจะเป็นส่วนหนึ่งของการคลิกสองครั้งหรือไม่ ด้วยเหตุนี้เราจึงกลับไปใช้ตัวจับเวลาและsetTimeout
เพื่อที่เราจะกลับไปใช้การจับเวลาและ
รวมทุกอย่างเข้าด้วยกันโดยใช้แอตทริบิวต์ข้อมูล (เพื่อหลีกเลี่ยงตัวแปรส่วนกลาง) และไม่จำเป็นต้องนับการคลิกด้วยตัวเองเราจะได้รับ:
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>
การสาธิต:
JSfiddle
หมายเหตุเกี่ยวกับการช่วยการเข้าถึงและความเร็วในการดับเบิลคลิก:
- ดังที่ Wikipedia ระบุไว้ว่า "ความล่าช้าสูงสุดที่จำเป็นสำหรับการคลิกสองครั้งติดต่อกันเพื่อตีความว่าเป็นการดับเบิลคลิกนั้นไม่ได้มาตรฐาน"
- ไม่มีวิธีตรวจจับความเร็วดับเบิลคลิกของระบบในเบราว์เซอร์
- ดูเหมือนว่าค่าเริ่มต้นคือ 500 ms และช่วง 100-900mms บน Windows (ที่มา )
- ลองนึกถึงคนพิการที่ตั้งค่าไว้ในการตั้งค่าระบบปฏิบัติการความเร็วในการดับเบิลคลิกจะช้าที่สุด
- หากความเร็วในการดับเบิ้ลคลิกของระบบช้ากว่าค่าเริ่มต้น 500 มิลลิวินาทีข้างต้นทั้งพฤติกรรมการคลิกครั้งเดียวและสองครั้งจะถูกทริกเกอร์
- อย่าใช้การพึ่งพาการคลิกครั้งเดียวและดับเบิลคลิกที่รวมกันและรายการเดียวกัน
- หรือ: เพิ่มการตั้งค่าในตัวเลือกเพื่อให้สามารถเพิ่มค่าได้
ใช้เวลาสักครู่ในการค้นหาวิธีแก้ปัญหาที่น่าพอใจฉันหวังว่านี่จะช่วยได้!