Không hoàn toàn rõ ràng câu hỏi của bạn là gì, nhưng nếu bạn chỉ muốn loại bỏ nhấp đúp, trong khi vẫn giữ hiệu ứng di chuột cho chuột, lời khuyên của tôi là:
- Thêm hiệu ứng di chuột vào
touchstart
và mouseenter
.
- Di di chuột hiệu ứng trên
mouseleave
, touchmove
và click
.
Lý lịch
Để mô phỏng chuột, các trình duyệt như Webkit mobile sẽ kích hoạt các sự kiện sau nếu người dùng chạm và thả ngón tay trên màn hình cảm ứng (như iPad) (nguồn: Touch And Mouse trên html5rocks.com):
touchstart
touchmove
touchend
- Độ trễ 300ms, trong đó trình duyệt đảm bảo đây là một lần chạm chứ không phải một lần chạm hai lần
mouseover
mouseenter
- Lưu ý : Nếu một
mouseover
, mouseenter
hoặc mousemove
sự kiện làm thay đổi nội dung trang, sự kiện sau đây không bao giờ bị sa thải.
mousemove
mousedown
mouseup
click
Dường như không thể chỉ đơn giản là nói với webbrowser bỏ qua các sự kiện chuột.
Tệ hơn nữa, nếu sự kiện rê chuột thay đổi nội dung trang, sự kiện nhấp chuột sẽ không bao giờ được kích hoạt, như được giải thích trên Hướng dẫn nội dung web Safari - Xử lý sự kiện , đặc biệt là hình 6.4 trong Sự kiện một ngón tay . Chính xác "thay đổi nội dung" là gì, sẽ phụ thuộc vào trình duyệt và phiên bản. Tôi đã thấy rằng đối với iOS 7.0, thay đổi màu nền không phải là (hoặc không còn nữa?) Thay đổi nội dung.
Giải pháp giải thích
Tóm lại:
- Thêm hiệu ứng di chuột vào
touchstart
và mouseenter
.
- Di di chuột hiệu ứng trên
mouseleave
, touchmove
và click
.
Lưu ý rằng không có hành động trên touchend
!
Điều này rõ ràng hoạt động cho các sự kiện chuột: mouseenter
và mouseleave
(các phiên bản cải tiến mouseover
và mouseout
) được bắn ra, đồng thời thêm và xóa di chuột.
Nếu người dùng thực sự click
sa liên kết, hiệu ứng di chuột cũng bị loại bỏ. Điều này đảm bảo rằng nó được gỡ bỏ nếu người dùng nhấn nút quay lại trong trình duyệt web.
Điều này cũng hoạt động cho các sự kiện cảm ứng: trên touchstart
hiệu ứng di chuột được thêm vào. Đó là '' 'không' '' bị xóa trên touchend
. Nó được thêm vào một lần nữa mouseenter
và vì điều này gây ra không có thay đổi nội dung (nó đã được thêm vào), click
sự kiện cũng được kích hoạt và liên kết được theo dõi mà không cần người dùng nhấp lại!
Độ trễ 300ms mà trình duyệt có giữa một touchstart
sự kiện và click
thực sự được sử dụng tốt vì hiệu ứng di chuột sẽ được hiển thị trong thời gian ngắn này.
Nếu người dùng quyết định hủy nhấp chuột, một động tác của ngón tay sẽ làm như vậy như bình thường. Thông thường, đây là một vấn đề vì không có mouseleave
sự kiện nào được kích hoạt và hiệu ứng di chuột vẫn được giữ nguyên. Rất may, điều này có thể dễ dàng được khắc phục bằng cách loại bỏ hiệu ứng di chuột trên touchmove
.
Đó là nó!
Lưu ý rằng có thể xóa độ trễ 300ms, ví dụ như sử dụng thư viện FastClick , nhưng điều này nằm ngoài phạm vi của câu hỏi này.
Các giải pháp thay thế
Tôi đã tìm thấy các vấn đề sau với các lựa chọn thay thế sau:
- phát hiện trình duyệt: Rất dễ bị lỗi. Giả sử rằng một thiết bị có chuột hoặc cảm ứng, trong khi sự kết hợp của cả hai sẽ ngày càng trở nên phổ biến hơn khi cảm ứng hiển thị phổ biến.
- Phát hiện phương tiện CSS: Giải pháp duy nhất chỉ CSS mà tôi biết. Vẫn dễ bị lỗi và vẫn cho rằng một thiết bị có chuột hoặc chạm, trong khi cả hai đều có thể.
- Giả lập sự kiện nhấp chuột trong
touchend
: Điều này sẽ theo liên kết không chính xác, ngay cả khi người dùng chỉ muốn cuộn hoặc thu phóng, mà không có ý định thực sự nhấp vào liên kết.
- Sử dụng một biến để triệt tiêu các sự kiện chuột: Điều này đặt một biến trong
touchend
đó được sử dụng làm điều kiện if trong các sự kiện chuột tiếp theo để ngăn chặn các thay đổi trạng thái tại thời điểm đó. Biến được đặt lại trong sự kiện nhấp chuột. Đây là một giải pháp tốt nếu bạn thực sự không muốn có hiệu ứng di chuột trên các giao diện cảm ứng. Thật không may, điều này không hoạt động nếu touchend
bị bắn vì một lý do khác và không có sự kiện nhấp nào được kích hoạt (ví dụ: người dùng cuộn hoặc thu phóng) và sau đó đang cố gắng theo liên kết bằng chuột (tức là trên thiết bị có cả giao diện chuột và cảm ứng ).
Đọc thêm
Xem thêm sự cố nhấp chuột đôi iPad / iPhone và Tắt hiệu ứng di chuột trên trình duyệt di động .