auxclick จะพร้อมใช้งานใน Chrome 55

เจฟฟ์ พอสนิก
เจฟฟ์ พอสนิก

เมื่อใดที่การคลิกไม่ใช่ click สำหรับนักพัฒนาเว็บที่ทำงานด้วยอินเทอร์เฟซผู้ใช้ ที่ซับซ้อน นี่ไม่ใช่คำถามเชิงปรัชญาเชิงนามธรรม หากคุณกำลังใช้การป้อนข้อมูลด้วยเมาส์ที่กำหนดเอง สิ่งสำคัญที่ต้องคำนึงถึงคือเจตนาของผู้ใช้ ตัวอย่างเช่น หากผู้ใช้คลิกลิงก์ด้วยปุ่มกลางของเมาส์ ก็ถือว่าเป็นเหตุผลที่คาดว่าผู้ใช้ต้องการเปิดแท็บใหม่ด้วยเนื้อหาของลิงก์นั้น หากผู้ใช้คลิกกลางที่องค์ประกอบ UI แบบสุ่ม คุณอาจต้องคิดว่าเหตุการณ์ดังกล่าวไม่ตั้งใจและเพิกเฉยต่ออินพุตนั้น ขณะที่การคลิกปุ่มหลักจะเป็นการทริกเกอร์การตอบสนองจาก UI

อาจเป็นไปได้ในกรณีที่ยุ่งยากเล็กน้อยในการสร้างรูปแบบการโต้ตอบที่แตกต่างกันเล็กน้อยเหล่านี้ผ่าน Listener เหตุการณ์ click รายการเดียว คุณต้องตรวจสอบพร็อพเพอร์ตี้ button ของ MouseEvent ให้ชัดเจนเพื่อดูว่ามีการตั้งค่าเป็น 0 หรือไม่ โดยแสดงถึงปุ่มหลักเทียบกับอื่นๆ โดย 1 จะแสดงปุ่มกลาง และอื่นๆ แต่ก็มีนักพัฒนาซอฟต์แวร์จำนวนไม่มากที่ตรวจสอบพร็อพเพอร์ตี้ button อย่างชัดเจน ซึ่งส่งผลให้โค้ดที่จัดการ click ทั้งหมดเหมือนกันหมด ไม่ว่าจะกดปุ่มใด

ตั้งแต่ Chrome 55 เป็นต้นไป MouseEvent ประเภทใหม่ที่เรียกว่า auxclick จะเริ่มทำงานเมื่อมีการคลิกที่เกิดจากปุ่มที่ไม่ใช่ปุ่มหลัก เมื่อใช้ร่วมกับเหตุการณ์ใหม่คือการเปลี่ยนแปลงลักษณะการทำงานของเหตุการณ์ click ที่สัมพันธ์กันซึ่งจะเริ่มทำงานเมื่อมีการกดปุ่มหลักของเมาส์เท่านั้น เราหวังว่าการเปลี่ยนแปลงเหล่านี้จะช่วยให้นักพัฒนาเว็บเขียนเครื่องจัดการเหตุการณ์ที่ตอบสนองต่อประเภทการคลิกเฉพาะที่ตนสนใจได้ง่ายขึ้น โดยไม่ต้องตรวจสอบพร็อพเพอร์ตี้ MouseEvent.button โดยเฉพาะ

ลดการตรวจสอบที่ผิดพลาด

อย่างที่ได้กล่าวไปแล้ว แรงจูงใจหนึ่งในการสร้าง auxclick คือเพื่อหลีกเลี่ยงการติดตั้งใช้งานตัวแฮนเดิล click ที่กำหนดเองซึ่งลบล้างลักษณะการทำงาน "คลิกกลาง-เปิด-a-tab" โดยไม่ได้ตั้งใจ ตัวอย่างเช่น สมมติว่าคุณเขียนเครื่องจัดการเหตุการณ์ click ที่ใช้ History API เพื่อเขียนแถบสถานที่ใหม่และใช้การนําทางแบบหน้าเดียวที่กําหนดเอง ซึ่งอาจมีหน้าตาดังนี้

document.querySelector('#my-link').addEventListener('click', event => {
    event.preventDefault();
    // ...call history.pushState(), use client-side rendering, etc....
});

ตรรกะที่กำหนดเองอาจทำงานได้ตามที่ต้องการเมื่อทริกเกอร์ด้วยปุ่มหลักของเมาส์ แต่หากโค้ดนั้นทำงานเมื่อมีการคลิกปุ่มกลาง ก็จะเกิดผลบวกลวง ก่อนการทำงานแบบใหม่นี้ ท้ายที่สุดแล้ว คุณจะป้องกันการทำงานเริ่มต้นอย่างการเปิดแท็บใหม่ ซึ่งขัดแย้งกับความคาดหวังของผู้ใช้ แม้ว่าคุณจะตรวจสอบ event.button === 0 อย่างชัดแจ้งที่จุดเริ่มต้นของแฮนเดิล และเรียกใช้โค้ดได้หากเป็นเช่นนั้น คุณอาจลืมหรือไม่เคยรู้เลยว่าจำเป็นต้องทำ

เรียกใช้โค้ดที่จำเป็นเท่านั้น

อีกด้านหนึ่งของผลบวกลวงที่น้อยกว่าก็คือโค้ดเรียกกลับ auxclick จะทำงานต่อเมื่อมีการคลิกปุ่มเมาส์ที่ไม่ใช่ปุ่มหลักจริงๆ เท่านั้น ตัวอย่างเช่น หากคุณมีโค้ดที่จำเป็นต้องคำนวณ URL ปลายทางที่เหมาะสมก่อนเปิดแท็บใหม่ คุณสามารถฟัง auxclick และรวมตรรกะนั้นไว้ในโค้ดเรียกกลับ โดยจะไม่มีค่าใช้จ่ายในการเรียกใช้เมื่อมีการคลิกปุ่มหลักของเมาส์

การรองรับเบราว์เซอร์และความเข้ากันได้

ปัจจุบันลักษณะการทำงานแบบใหม่นี้ใช้ได้ใน Chrome 55 เท่านั้น ตามที่ได้กล่าวไว้ในข้อเสนอเริ่มต้น เราให้ความสำคัญกับความคิดเห็น (ทั้งแง่บวกและแง่ลบ) จากชุมชนนักพัฒนาเว็บ การส่งปัญหาเกี่ยวกับ GitHub เป็นวิธีที่ดีที่สุดที่จะแชร์ความคิดเห็นดังกล่าวกับคนที่กำลังอยู่ในกระบวนการทำให้เป็นมาตรฐาน

ในระหว่างนี้ นักพัฒนาแอปไม่จำเป็นต้องรอให้ auxclick พร้อมใช้งานในวงกว้างเพื่อทำตามแนวทางปฏิบัติแนะนำในการจัดการเหตุการณ์เมาส์ หากคุณตรวจสอบค่าของพร็อพเพอร์ตี้ MouseEvent.button ในตอนต้นของเครื่องจัดการเหตุการณ์ click คุณจะมั่นใจได้ว่ามีการดำเนินการที่เหมาะสม รูปแบบต่อไปนี้จะจัดการกับคลิกหลักและคลิกเสริมแตกต่างกัน ไม่ว่า จะมีการรองรับในตัวสำหรับ auxclick หรือไม่ก็ตาม

function handlePrimaryClick(event) {
    // ...code to handle the primary button click...
}

function handleAuxClick(event) {
    // ...code to handle the auxiliary button click….
}

document.querySelector('#my-link').addEventListener('click', event => {
    if (event.button === 0) {
    return handlePrimaryClick(event);
    }


    // This provides fallback behavior in browsers without auxclick.
    return handleAuxClick(event);
});

// Explicitly listen for auxclick in browsers that support it.
document.querySelector('#my-link').addEventListener('auxclick', handleAuxClick);