Gibt es eine Entsprechung zur e.PageX-Position für das 'Touchstart'-Ereignis wie für das Klick-Ereignis?


104

Ich versuche mit jQuery die X-Position eines Touchstart-Ereignisses zu ermitteln, das mit der Live-Funktion verwendet wird.

Dh

$('#box').live('touchstart', function(e) { var xPos = e.PageX; } );

Dies funktioniert nun mit 'click' als Ereignis. Wie um alles in der Welt (ohne Alpha jQuery Mobile) erhalte ich es mit einem Touch-Ereignis?

Irgendwelche Ideen?

Vielen Dank für jede Hilfe.


Ich habe dies für diejenigen gefunden, die Hilfe benötigen: - stackoverflow.com/questions/3183872/… Es funktioniert auch beim Touchstart.
Waxical

Antworten:


180

Etwas spät, aber Sie müssen auf das ursprüngliche Ereignis zugreifen, nicht auf das massierte jQuery-Ereignis. Da es sich um Multi-Touch-Ereignisse handelt, müssen weitere Änderungen vorgenommen werden:

$('#box').live('touchstart', function(e) {
  var xPos = e.originalEvent.touches[0].pageX;
});

Wenn Sie andere Finger möchten, können Sie diese in anderen Indizes der Berührungsliste finden.

UPDATE FÜR NEUERE JQUERY:

$(document).on('touchstart', '#box', function(e) {
  var xPos = e.originalEvent.touches[0].pageX;
});

Sie haben eine fehlende
Endklammer

Du hast Recht. Überrascht hat es seit 2 Jahren niemand mehr bemerkt! =) Danke!
Mkoistinen

Leider hat es bei mir nicht funktioniert, ich musste am ersten das x und y bekommen touchmove.
Andrew

@andrewb, fügen Sie e.preventDefault()in touchstartEvent - Handler.
Matewka

Danke Kumpel. Gut e.touches[0].pageX;für mich gearbeitet
Jayant Varshney

43

Ich benutze diese einfache Funktion für JQuery-basierte Projekte

    var pointerEventToXY = function(e){
      var out = {x:0, y:0};
      if(e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel'){
        var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
        out.x = touch.pageX;
        out.y = touch.pageY;
      } else if (e.type == 'mousedown' || e.type == 'mouseup' || e.type == 'mousemove' || e.type == 'mouseover'|| e.type=='mouseout' || e.type=='mouseenter' || e.type=='mouseleave') {
        out.x = e.pageX;
        out.y = e.pageY;
      }
      return out;
    };

Beispiel:

$('a').on('mousedown touchstart', function(e){
  console.log(pointerEventToXY(e)); // will return obj ..kind of {x:20,y:40}
})

hoffe das ist nützlich für dich;)


13
Der Ereignistyp muss nicht überprüft werden, da e.pageX für Touch-Ereignisse nicht definiert ist. Tun Sie es einfachout.x = e.pageX || e.originalEvent.touches[0].pageX;
Griffin

1
Bevor ich zurückkehre, füge ich diesen Teil hinzu, um die prozentuale Position basierend auf dem übergeordneten Element zu ermitteln, falls dies jemandem hilft ... var offsetParent = e.target.offsetParent; var parentLeft = e.target.offsetParent.offsetLeft; out.percentX = (out.x - offsetParent.offsetLeft) / offsetParent.offsetWidth; out.percentY = (out.y - offsetParent.offsetTop) / offsetParent.offsetHeight; kehre zurück;
Sradforth

if(e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel'){-> if (e.type.startsWith("touch"))?
Gil9red

@Griffin - Ich denke, das Problem mit Ihrem Vorschlag ist, dass auf dem Desktop, wenn sich die Maus am linken Rand des Dokuments befindet, der erste Zweig Ihrer Anweisung 0 ergibt, was als falsch interpretiert wird, und dann der Browser aufgrund von Berührungen fehlerhaft ist ist im zweiten Zweig undefiniert. Zustimmen?
MSC

13

Ich habe hier einige der anderen Antworten ausprobiert, aber originalEvent war auch undefiniert. Bei der Inspektion wurde eine TouchList-klassifizierte Eigenschaft gefunden (wie von einem anderen Poster vorgeschlagen) und es gelang, auf folgende Weise zu pageX / Y zu gelangen:

var x = e.changedTouches[0].pageX;

4
Dies funktioniert gut für alle Javascript-basierten Codes. Schraube jquery
Martian2049

2
Mein Retter! Funktioniert auch für touchmove () perfekt.
Tibix


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.