2012-03-11 35 views
10

Trình duyệt di động mô phỏng sự kiện chuột để hỗ trợ các trang web chỉ đính kèm trình xử lý cho sự kiện chuột. Tuy nhiên, nếu bạn muốn triển khai hai mô hình tương tác - một cho các sự kiện chuột và một cho sự kiện chạm - thì sẽ hữu ích nếu ngăn trình duyệt mô phỏng sự kiện chuột.Làm thế nào để ngăn chặn các sự kiện chuột mô phỏng trong các trình duyệt di động?

Trên iOS Safari này là khá đơn giản - chỉ cần chạy preventDefault trên touchend:

jQuery(document).on('touchend', function(e) { 
    // Do some logic  
    e.preventDefault(); 
}); 

Đó là khá lành mạnh. Thật không may, cả trình duyệt mặc định của Android lẫn Dolfin đều không hủy mô phỏng chuột bằng kỹ thuật này. (Dolfin sẽ hủy bỏ mousedown khi ngăn chặnDefault được chạy trên touchstart - nhưng đó không phải là rất hữu ích, bởi vì bạn không biết những gì hành động ngón tay sẽ đưa vào touchstart.)

Có một số cách khác có điều kiện, hoặc thậm chí không có điều kiện , ngăn chặn các sự kiện chuột được mô phỏng kích hoạt?

[EDIT]

Để bắt đầu hiểu vấn đề (s) tốt hơn, tôi đã bắt đầu một bảng tương thích các sự kiện liên lạc tại địa chỉ: http://labs.cruncher.ch/touch-events-compatibility-table/

+0

Ngoài ra, nhận xét từ trải nghiệm với Chrome hoặc FF di động được đánh giá cao. – stephband

+2

Bạn có thể phát hiện xem đó là trình duyệt dành cho thiết bị di động hay không trước khi đính kèm các sự kiện chuột? –

+0

@JaredFarrish Các phương pháp phát hiện trình duyệt di động không bao giờ chính xác 100%. –

Trả lời

3

Trong khi có một số cách xảo quyệt để đạt được điều này, có hai thông lệ phổ biến mà tôi sử dụng để có được xung quanh sự khác biệt này:

1) sử dụng cờ

Thiết cờ boolean trong xử lý sự kiện của bạn, chẳng hạn như 012.hoặc mouseIsMoving, có thể được thiết lập và kiểm tra cho các sự kiện chuột và cảm ứng. Nếu người dùng nhấp chuột, hãy chấp nhận điều đó dưới dạng sự kiện chuột. Sau đó, nếu một sự kiện cảm ứng xảy ra cùng với nó, hãy bỏ qua nó.

2) Thực hiện chỉ những gì cần thiết

Vâng, đây là thực hành tốt anyway. Đừng bận tâm thêm các sự kiện touchmovemousemove nếu bạn không cần. Nó sẽ chỉ làm cho nó khó khăn hơn để duy trì mã. Chỉnh sửa: Có lẽ cần phải cụ thể hơn: xem xét xem xét lại giao diện người dùng của bạn nếu bạn cần theo dõi sự kiện nâng cao hơn.

Cuối cùng, không dựa vào danh sách cấu hình phần cứng bên ngoài, vì các danh sách này hiếm khi 'hoàn toàn' chính xác.

+0

Đề xuất đầu tiên của bạn nói về cơ bản '$ (document.body).mousemove() ', mà sẽ thiết lập một lá cờ toàn cầu, sau đó được loại bỏ, và nó sẽ được sử dụng trong mỗi sự kiện' mouse-'để phát hiện sự hiện diện của một con chuột? –

+0

1) Sự cố với sự kiện được mô phỏng là sự kiện liên lạc kích hoạt trước, sau đó là sự kiện chuột - vì vậy khi sự kiện chuột xuất hiện, sự kiện chạm đã hoàn tất. Thứ hai, lưu trữ nhà nước như thế này có thể nhận được khá lông (tùy thuộc vào những gì bạn đang làm) khi giao dịch với nhiều chạm. Tôi cố gắng không lưu trữ trạng thái bất cứ khi nào có thể. Thứ ba, tôi muốn đối phó với mã đã được viết để sử dụng các sự kiện chuột - Tôi không muốn đi vào tất cả các trình xử lý và chèn mã có điều kiện yêu cầu nếu chúng ta đang ở trong một giao diện cảm ứng. Tôi đánh giá cao câu trả lời của bạn, mặc dù! – stephband

+0

Ngoài ra, tôi nghĩ rằng thứ hai của bạn không thực sự là một cách tiếp cận khác, nó chỉ là thực hành tốt. Câu trả lời thực sự của bạn là câu trả lời đầu tiên, với câu trả lời thứ hai là lời nhắc suy nghĩ cẩn thận về những gì bạn thực sự cần (luôn là lời khuyên tốt). –

Các vấn đề liên quan