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.