Làm cách nào tôi có thể nhận ra các sự kiện chạm bằng jQuery trong Safari cho iPad? Có thể không?


191

Có thể nhận ra các sự kiện chạm trên trình duyệt Safari của iPad bằng jQuery không?

Tôi đã sử dụng các sự kiện mouseOver và mouseOut trong một ứng dụng web. Có bất kỳ sự kiện tương tự nào cho trình duyệt Safari của iPad không vì không có sự kiện nào như mouseOut và mouseMove?

Câu trả lời:


240

Core jQuery không có gì đặc biệt cho các sự kiện chạm, nhưng bạn có thể dễ dàng tự tạo bằng cách sử dụng các sự kiện sau

  • bắt đầu
  • cảm ứng
  • cảm ứng
  • cảm ứng

Ví dụ: touchmove

document.addEventListener('touchmove', function(e) {
    e.preventDefault();
    var touch = e.touches[0];
    alert(touch.pageX + " - " + touch.pageY);
}, false);

Điều này hoạt động trong hầu hết các trình duyệt dựa trên WebKit (bao gồm Android).

Đây là một số tài liệu tốt .


2
Cảm ơn David rất nhiều, tôi nghĩ nó sẽ hoạt động nhưng e.touches là gì? bạn có thể mô tả chi tiết đối số "e" không?
Abhishek B.

7
e là đối tượng sự kiện được tự động chuyển đến bộ xử lý. Đối với trình duyệt safari (và cả android nữa), giờ đây nó chứa một mảng tất cả những lần chạm mà người dùng đã thực hiện trên màn hình. Mỗi lần chạm có các thuộc tính riêng (ví dụ: x, y coords)
David Pean

1
bây giờ làm thế nào để bạn tìm kiếm yếu tố nào để kích hoạt sự kiện vào -__-
Muhammad Umer

148

Nếu bạn đang sử dụng jQuery 1.7+, nó thậm chí còn đơn giản hơn tất cả các câu trả lời khác.

$('#whatever').on({ 'touchstart' : function(){ /* do something... */ } });

1
Vâng, Timothy, tôi đã không được sử dụng phiên bản 1.7+ tại thời điểm tôi bắt đầu dự án của mình. Bây giờ onwords Tôi đang sử dụng jquery 1.7+ .. Cảm ơn bạn đã gợi ý và trả lời tốt .. Cảm ơn rất nhiều. :)
Abhishek B.

7
Điều này hoạt động tốt. Tôi cần nhấp và chạm để làm điều tương tự, và tôi đã quen với cú pháp không phải đối tượng, như$('#whatever').on('touchstart click', function(){ /* do something... */ });
goodeye

1
Khi tôi đi $('#whatever').on({ 'touchstart' : function(ev){}});, evdường như không có bất kỳ thông tin nào về các lần chạm (chạm, nhắm mục tiêu hoặc thay đổiTouches)
Bạch tuộc

8
@Octopus: Bạn sẽ tìm thấy thông tin liên lạc bên dưới ev.originalEvent.
Peter Bloomfield

1
@edonbajrami vâng, tất nhiên rồi. kiểm tra tài liệu và tìm kiếm "sự kiện được ủy nhiệm". $ ("# phần tử để giám sát các phần tử mới"). on ("eventX", "#element", function (event) {/ * anything * /});
honk31

24

Cách tiếp cận đơn giản nhất là sử dụng thư viện JavaScript đa điểm như Hammer.js . Sau đó, bạn có thể viết mã như:

canvas
    .hammer({prevent_default: true})
    .bind('doubletap', function(e) { // And double click
        // Zoom-in
    })
    .bind('dragstart', function(e) { // And mousedown
        // Get ready to drag
    })
    .bind('drag', function(e) { // And mousemove when mousedown
        // Pan the image
    })
    .bind('dragend', function(e) { // And mouseup
        // Finish the drag
    });

Và bạn có thể tiếp tục đi. Nó hỗ trợ chạm, chạm đúp, vuốt, giữ, biến đổi (tức là chụm) và kéo. Các sự kiện chạm cũng kích hoạt khi các hành động chuột tương đương xảy ra, vì vậy bạn không cần phải viết hai bộ xử lý sự kiện. Ồ, và bạn cần plugin jQuery nếu bạn muốn có thể viết theo cách jQueryish như tôi đã làm.


29
giải pháp "đơn giản nhất" không bao giờ liên quan đến việc làm cho vấn đề trở nên phức tạp hơn bằng cách thêm các thư viện
Octopus

13
@Octopus Giải pháp đơn giản nhất là sử dụng búa.js trừu tượng hóa các cơn đau đầu trên trình duyệt chéo. Sử dụng phần mở rộng jQuery để ở trong vùng quen thuộc của bạn. Có vẻ như không quá phức tạp với tôi.
trusktr

1
giải pháp được cho là "đơn giản nhất" thường là giải pháp mà mọi người làm hỏng nhất ... bất cứ điều gì bạn làm, đừng quên đảm bảo giải pháp của bạn hoạt động trên các thiết bị hỗ trợ cả chuột và chuột, như Microsoft Surface
Simon_Weaver

1
@Octopus: "Khi tất cả những gì bạn có là một cái búa [sic] ... mọi thứ trông giống như một cái đinh" :)
Mã hóa

Đó là THỜI GIAN HAMmer! Cảm ơn bạn đã chia sẻ thư viện này, thật dễ dàng để cài đặt trên ứng dụng của tôi và chạy! Mất một giây để thiết lập vì trình xử lý sự kiện khác nhau, nhưng một console.log (sự kiện) đơn giản cho bạn biết những gì bạn cần. CẢM ƠN!
Andy

24

Sử dụng touchstart hoặc touchend một mình không phải là một giải pháp tốt, bởi vì nếu bạn cuộn trang, thiết bị sẽ phát hiện ra nó là chạm hoặc chạm quá. Vì vậy, cách tốt nhất để phát hiện sự kiện chạm và nhấp cùng lúc là chỉ phát hiện các sự kiện chạm không di chuyển màn hình (cuộn). Vì vậy, để làm điều này, chỉ cần thêm mã này vào ứng dụng của bạn:

$(document).on('touchstart', function() {
    detectTap = true; // Detects all touch events
});
$(document).on('touchmove', function() {
    detectTap = false; // Excludes the scroll events from touch events
});
$(document).on('click touchend', function(event) {
    if (event.type == "click") detectTap = true; // Detects click events
       if (detectTap){
          // Here you can write the function or codes you want to execute on tap

       }
 });

Tôi đã thử nghiệm nó và nó hoạt động tốt cho tôi trên iPad và iPhone. Nó phát hiện chạm và có thể phân biệt cuộn và chạm dễ dàng.


2
Giải pháp này dường như là hướng đi thẳng nhất mà tôi đã tìm thấy và dường như hoạt động rất tốt trên iOS.
Joshua Lawrence Austill

Tôi đã sử dụng jquery mobile trước, nhưng sau đó nó đã can thiệp vào các chức năng khác. Tôi đang sử dụng điều này bây giờ và hoạt động hoàn hảo. Không có vấn đề cho đến nay.
Anurag Priyadarshi

18

Bạn có thể sử dụng .on () để chụp nhiều sự kiện và sau đó kiểm tra cảm ứng trên màn hình, ví dụ:

$('#selector')
.on('touchstart mousedown', function(e){
  e.preventDefault();
  var touch = e.touches[0];
  if(touch){
    // Do some stuff
  }
  else {
    // Do some other stuff
  }
});

ngoại trừ việc .bind là phản đối Bạn nên sử dụng.on
jcuenod 21/07/2015

15

jQuery Core không có gì đặc biệt, nhưng bạn có thể đọc trên jQuery Mobile Events trang về các sự kiện cảm ứng khác nhau, cũng hoạt động trên các thiết bị iOS khác.

Họ đang:

  • chạm và giữ
  • vuốt
  • swipeleft
  • vuốt sang phải

Cũng lưu ý rằng trong các sự kiện cuộn (dựa trên cảm ứng trên thiết bị di động), thiết bị iOS sẽ đóng băng thao tác DOM trong khi cuộn.


Cảm ơn đã cho thời gian quan trọng của bạn cho câu hỏi của tôi. Tôi nhìn vào các sự kiện của Jquery Mobile .. Cảm ơn bạn.
Abhishek B.

Những sự kiện đó không thực sự đại diện cho tương tác cảm ứng thực sự.
trusktr

JQuery Core có phải là một danh từ thích hợp thực tế không?
Peter Mortensen

6

Tôi đã có một chút lo lắng về việc chỉ sử dụng touchmove cho dự án của mình, vì nó dường như chỉ phát sáng khi cảm ứng của bạn di chuyển từ vị trí này sang vị trí khác (chứ không phải trên lần chạm đầu tiên). Vì vậy, tôi đã kết hợp nó với touchstart , và điều này dường như hoạt động rất tốt cho lần chạm đầu tiên và bất kỳ chuyển động nào.

<script>

function doTouch(e) {
    e.preventDefault();
    var touch = e.touches[0];

    document.getElementById("xtext").innerHTML = touch.pageX;
    document.getElementById("ytext").innerHTML = touch.pageY;   
}

document.addEventListener('touchstart', function(e) {doTouch(e);}, false);
document.addEventListener('touchmove', function(e) {doTouch(e);}, false);

</script>

X: <div id="xtext">0</div>
Y: <div id="ytext">0</div>

Tôi cũng đã thêm điều này để phát hiện bao nhiêu thời gian đã trôi qua kể từ sự kiện cuối cùng ..document.getElementById("ttime").innerHTML = ((new Date()) - touchTime); touchTime = new Date();
hanamj

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.