İPad için Safari'de jQuery kullanarak dokunma olaylarını nasıl tanıyabilirim? Mümkün mü?


192

JQuery kullanarak iPad'in Safari tarayıcısındaki dokunma olaylarını tanımak mümkün müdür?

Bir web uygulamasında mouseOver ve mouseOut olaylarını kullandım. MouseOut ve mouseMove gibi bir etkinlik olmadığından iPad'in Safari tarayıcısı için benzer etkinlikler var mı?

Yanıtlar:


240

Core jQuery'nin dokunma olayları için özel bir şeyi yoktur, ancak aşağıdaki olayları kullanarak kendinizinkini kolayca oluşturabilirsiniz.

  • touchstart
  • touchmove
  • touchEnd
  • touchcancel

Örneğin, touchmove

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

Bu, çoğu WebKit tabanlı tarayıcıda (Android dahil) çalışır.

İşte bazı iyi belgeler .


2
Çok teşekkürler David, bence işe yarayacak ama e.touches [0] nedir? "e" argümanını ayrıntılı olarak açıklayabilir misiniz?
Abhishek B.

7
e, işleyiciye otomatik olarak iletilen olay nesnesidir. Safari tarayıcısı (ve android de) artık kullanıcının ekranda yaptığı tüm dokunuşları içermektedir. Her dokunuşun kendine özgü özellikleri vardır (örneğin x, y koordinatları)
David Pean

1
şimdi -__- olayı tetiklemek için hangi öğeyi bulmak hakkında gitmek
Muhammed Umer

Doğru cevabın Timothy Perez tarafından verilen cevap olduğunu unutmayın, bu güncellenmez.
EPurpl3

149

JQuery 1.7+ kullanıyorsanız, diğer tüm cevaplardan daha da basittir.

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

1
Evet, Timothy, projemi başlattığımda 1.7+ sürümü kullanmadım. şimdi onwords jquery 1.7+ kullanıyorum .. iyi öneri ve cevap için teşekkürler .. çok teşekkürler. :)
Abhishek

7
Bu iyi çalışıyor. Aynı şeyi yapmak için tıklama ve dokunma başlatmaya ihtiyacım vardı ve nesne olmayan sözdizimine $('#whatever').on('touchstart click', function(){ /* do something... */ });
alışkınım

1
Ben gidince $('#whatever').on({ 'touchstart' : function(ev){}});, evdokunuşlar (dokunuşlar, targetTouches veya changedTouches) hakkında herhangi bir bilgi var gibi görünmüyor
Ahtapot

8
@Octopus: Dokunma bilgilerini altında bulabilirsiniz ev.originalEvent.
Peter Bloomfield

1
@edonbajrami evet, elbette. dokümanları kontrol edin ve "yetkilendirilmiş etkinlikler" arayın. $ ("yeni öğeler için izlenecek # öğesi"). on ("eventX", "#element", function (event) {/ * ne olursa olsun * /});
honk31

24

En basit yaklaşım Hammer.js gibi çok dokunuşlu bir JavaScript kitaplığı kullanmaktır . Sonra şöyle bir kod yazabilirsiniz:

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
    });

Ve devam edebilirsin. Musluk, çift dokunma, çekme, tutma, dönüştürme (çimdikleme) ve sürüklemeyi destekler. Dokunmatik olaylar, eşdeğer fare eylemleri gerçekleştiğinde de tetiklenir, bu nedenle iki olay kümesi işleyicisi yazmanıza gerek yoktur. Oh, ve benim yaptığım gibi jQueryish şekilde yazmak istiyorsanız jQuery eklentisine ihtiyacınız var.


29
"en basit" çözüm hiçbir zaman kütüphaneler ekleyerek bir sorunu daha karmaşık hale getirmeyi
Octopus

13
@Octopus En basit çözüm, tarayıcılar arası baş ağrılarını ortadan kaldıran hammer.js kullanmaktır. Tanıdık bölgenizde olmak için jQuery uzantısını kullanın. Bana çok karmaşık gelmiyor.
trusktr

1
sözde "en basit" çözüm genellikle insanların en çok vidaladığı çözümdür ... ne yaparsanız yapın, çözümünüzün Microsoft Surface gibi dokunmatik ve fareyi destekleyen cihazlarda çalıştığından emin olmayı unutmayın
Simon_Weaver

1
@Octopus: "Sahip olduğunuz tek şey bir çekiç [sic] ... her şey bir çivi gibi görünüyor" :)
Gone Coding

ÇEKİÇ ZAMANI! Bu kütüphaneyi paylaştığınız için teşekkür ederim, uygulamama yüklemek ve çalışmaya başlamak kolaydı! Olay işleyicisi farklı olduğu için kurulum için bir saniye aldı, ancak basit bir console.log (event) size neye ihtiyacınız olduğunu söyler. TEŞEKKÜRLER!
Andy

24

Touchstart veya touchend'i tek başına kullanmak iyi bir çözüm değildir, çünkü sayfayı kaydırırsanız cihaz da dokunma veya dokunma olarak algılar. Bu nedenle, bir dokun ve tıkla olayını aynı anda algılamanın en iyi yolu, yalnızca ekranı hareket ettirmeyen dokunma olaylarını (kaydırma) algılamaktır. Bunu yapmak için, bu kodu uygulamanıza eklemeniz yeterlidir:

$(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

       }
 });

Test ettim ve iPad ve iPhone'da benim için iyi çalışıyor. Musluğu algılar ve dokun ve dokunarak kaydırmayı kolayca ayırt edebilir.


2
Bu çözüm bulduğum en basit şey gibi görünüyor ve iOS'ta harika çalışıyor gibi görünüyor.
Joshua Lawrence Austill

İlk önce jquery mobile kullandım, ancak daha sonra diğer işlevlere müdahale etti. Bunu şimdi kullanıyorum ve mükemmel çalışıyor. Şu ana kadar sorun yok.
Anurag Priyadarshi

18

Birden çok olayı yakalamak için .on () öğesini kullanabilir ve ardından ekranda dokunma olup olmadığını test edebilirsiniz, örneğin:

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

bunun dışında .bindkullanımdan kaldırılmıştır. Kullanmalısınız.on
jcuenod

15

jQuery Core'un özel bir şeyi yoktur, ancak jQuery Mobile Events sayfasında iOS cihazlarının dışında da çalışan farklı dokunma olayları hakkında okuyabilirsiniz .

Onlar:

  • dokunmak
  • basılı tut
  • Tokatlamak
  • sola sürükle
  • sağa kaydır

Ayrıca kaydırma etkinlikleri sırasında (mobil cihazlarda dokunmaya dayalı olarak) iOS cihazlarının kaydırma sırasında DOM manipülasyonunu dondurduğuna dikkat edin.


Sorum için önemli zaman ayırdığınız için teşekkürler. Jquery Mobile etkinliklerine bakıyorum .. Teşekkür ederim.
Abhishek B.

Bu olaylar gerçek dokunma etkileşimini tam olarak temsil etmiyor.
trusktr

JQuery Core gerçek bir doğru isim midir?
Peter Mortensen

6

Projem için sadece touchmove kullanma konusunda biraz endişeliydim , çünkü sadece dokunuşunuz bir konumdan diğerine geçtiğinde (ilk dokunuşta değil) ateş ediyor gibi görünüyor. Bu yüzden onu touchstart ile birleştirdim ve bu ilk dokunuş ve herhangi bir hareket için çok iyi çalışıyor gibi görünüyor.

<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>

Ayrıca, son olaydan bu yana ne kadar zaman geçtiğini tespit etmek için bunu ekledim ..document.getElementById("ttime").innerHTML = ((new Date()) - touchTime); touchTime = new Date();
hanamj

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.