ฉันเข้าใจจากคำถามของคุณที่ว่าการวางเมาส์ของคุณจะเปลี่ยนเนื้อหาในเพจของคุณ ในกรณีนี้คำแนะนำของฉันคือ:
- เพิ่มโฉบผลกระทบต่อและ
touchstart
mouseenter
- นำผลกระทบเลื่อนบน
mouseleave
, และtouchmove
click
หรือคุณสามารถแก้ไขเพจของคุณที่ไม่มีการเปลี่ยนแปลงเนื้อหาได้
พื้นหลัง
ในการจำลองเมาส์เบราว์เซอร์เช่น Webkit mobile จะยิงเหตุการณ์ต่อไปนี้หากผู้ใช้แตะและปล่อยนิ้วบนหน้าจอสัมผัส (เช่น iPad) (ที่มา: Touch And Mouseบน html5rocks.com):
touchstart
touchmove
touchend
- ความล่าช้า 300 มิลลิวินาทีโดยที่เบราว์เซอร์ตรวจสอบให้แน่ใจว่าเป็นการแตะเพียงครั้งเดียวไม่ใช่การแตะสองครั้ง
mouseover
mouseenter
- หมายเหตุ : ถ้า
mouseover
, mouseenter
หรือmousemove
เหตุการณ์การเปลี่ยนแปลงเนื้อหาของหน้าเหตุการณ์ต่อไปนี้จะไม่ยิง
mousemove
mousedown
mouseup
click
ดูเหมือนจะเป็นไปไม่ได้ที่จะบอกให้เว็บเบราว์เซอร์ข้ามเหตุการณ์ของเมาส์
ที่แย่ไปกว่านั้นคือหากเหตุการณ์วางเมาส์เปลี่ยนเนื้อหาของหน้าเหตุการณ์การคลิกจะไม่เริ่มทำงานตามที่อธิบายไว้ในคู่มือเนื้อหาเว็บ Safari - การจัดการเหตุการณ์โดยเฉพาะรูปที่ 6.4 ในเหตุการณ์ด้วยนิ้วเดียว "การเปลี่ยนแปลงเนื้อหา" คืออะไรจะขึ้นอยู่กับเบราว์เซอร์และเวอร์ชัน ฉันพบว่าสำหรับ iOS 7.0 การเปลี่ยนสีพื้นหลังไม่ใช่การเปลี่ยนแปลงเนื้อหา (หรือไม่มีอีกต่อไป)
อธิบายวิธีแก้ปัญหา
สรุป:
- เพิ่มโฉบผลกระทบต่อและ
touchstart
mouseenter
- นำผลกระทบเลื่อนบน
mouseleave
, และtouchmove
click
โปรดทราบว่าไม่มีการดำเนินการใดtouchend
ๆ !
สิ่งนี้ใช้ได้กับเหตุการณ์ของเมาส์อย่างชัดเจน: mouseenter
และmouseleave
(เวอร์ชันปรับปรุงเล็กน้อยmouseover
และmouseout
) จะเริ่มทำงานและเพิ่มและลบโฮเวอร์
หากผู้ใช้เป็นclick
ลิงก์จริงผลการวางเมาส์จะถูกลบออกไปด้วย เพื่อให้แน่ใจว่าจะถูกลบออกหากผู้ใช้กดปุ่มย้อนกลับในเว็บเบราว์เซอร์
นอกจากนี้ยังใช้ได้กับเหตุการณ์การสัมผัส: เมื่อแตะเริ่มต้นเอฟเฟกต์โฮเวอร์จะถูกเพิ่ม มันคือ '' 'ไม่' '' ถูกลบออกเมื่อสัมผัส มันถูกเพิ่มอีกครั้งmouseenter
และเนื่องจากสิ่งนี้ทำให้ไม่มีการเปลี่ยนแปลงเนื้อหา (ได้ถูกเพิ่มไปแล้ว) click
เหตุการณ์จึงเริ่มทำงานและลิงก์จะตามมาโดยไม่จำเป็นให้ผู้ใช้คลิกอีกครั้ง!
ความล่าช้า 300 มิลลิวินาทีที่เบราว์เซอร์มีระหว่างtouchstart
เหตุการณ์และclick
ถูกนำไปใช้งานจริงเนื่องจากเอฟเฟกต์โฮเวอร์จะแสดงในช่วงเวลาสั้น ๆ นี้
หากผู้ใช้ตัดสินใจที่จะยกเลิกการคลิกการเลื่อนนิ้วจะทำได้เหมือนปกติ โดยปกติปัญหานี้เป็นปัญหาเนื่องจากไม่มีการmouseleave
ยิงเหตุการณ์และเอฟเฟกต์โฮเวอร์ยังคงอยู่ touchmove
โชคดีที่นี้สามารถแก้ไขโดยการเอาผลโฉบบน
แค่นั้นแหละ!
โปรดทราบว่าเป็นไปได้ที่จะลบการหน่วงเวลา 300 มิลลิวินาทีตัวอย่างเช่นการใช้ไลบรารี FastClickแต่คำถามนี้อยู่นอกขอบเขตสำหรับคำถามนี้
โซลูชั่นทางเลือก
ฉันพบปัญหาต่อไปนี้กับทางเลือกต่อไปนี้:
- การตรวจจับเบราว์เซอร์:มีแนวโน้มที่จะเกิดข้อผิดพลาดอย่างมาก สมมติว่าอุปกรณ์มีเมาส์หรือระบบสัมผัสในขณะที่การใช้ทั้งสองอย่างร่วมกันจะกลายเป็นเรื่องปกติมากขึ้นเรื่อย ๆ เมื่อการแสดงผลแบบสัมผัสมีสัญญาณรบกวน
- การตรวจจับสื่อ CSS:โซลูชัน CSS เท่านั้นที่ฉันรู้จัก ยังคงมีแนวโน้มที่จะเกิดข้อผิดพลาดและยังคงถือว่าอุปกรณ์มีเมาส์หรือสัมผัสในขณะที่ทั้งสองอย่างเป็นไปได้
- จำลองเหตุการณ์การคลิกใน
touchend
:สิ่งนี้จะไปตามลิงก์อย่างไม่ถูกต้องแม้ว่าผู้ใช้จะต้องการเลื่อนหรือซูมเท่านั้นโดยไม่ได้ตั้งใจที่จะคลิกลิงก์จริงๆ
- ใช้ตัวแปรเพื่อระงับเหตุการณ์ของเมาส์:ตั้งค่าตัวแปร
touchend
ที่ใช้เป็น if-condition ในเหตุการณ์ต่อมาของเมาส์เพื่อป้องกันการเปลี่ยนแปลงสถานะ ณ เวลานั้น ตัวแปรจะถูกรีเซ็ตในเหตุการณ์คลิก ดูคำตอบของ Walter Roman ในหน้านี้ นี่เป็นทางออกที่ดีหากคุณไม่ต้องการให้มีการวางเมาส์บนอินเทอร์เฟซแบบสัมผัส น่าเสียดายที่วิธีนี้ใช้ไม่ได้หาก a touchend
ถูกยิงด้วยเหตุผลอื่นและไม่มีเหตุการณ์การคลิกเริ่มทำงาน (เช่นผู้ใช้เลื่อนหรือซูม) และต่อมาพยายามติดตามลิงก์ด้วยเมาส์ (เช่นบนอุปกรณ์ที่มีทั้งเมาส์และอินเทอร์เฟซแบบสัมผัส )
อ่านเพิ่มเติม
- http://jsfiddle.net/macfreek/24Z5M/ ทดสอบวิธีแก้ปัญหาข้างต้นด้วยตัวคุณเองในแซนด์บ็อกซ์นี้
- http://www.macfreek.nl/memory/Touch_and_mouse_with_hover_effects_in_a_web_browser คำตอบเดียวกันนี้พร้อมพื้นหลังอีกเล็กน้อย
- https://www.html5rocks.com/en/mobile/touchandmouse/ บทความพื้นหลังที่ดีใน html5rocks.com เกี่ยวกับการสัมผัสและเมาส์โดยทั่วไป
- https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html คู่มือเนื้อหาเว็บ Safari - การจัดการเหตุการณ์ ดูในรูปที่ 6.4 โดยเฉพาะซึ่งอธิบายว่าจะไม่มีการเริ่มเหตุการณ์ใด ๆ อีกหลังจากการเปลี่ยนแปลงเนื้อหาระหว่างเหตุการณ์
mouseover
หรือmousemove
เหตุการณ์