2013-08-05 6 views
20

Ich suchte die letzten 30 Minuten, fand aber keine Lösung.manuell Touch-Ereignis auslösen

Ich möchte ein touchstart Ereignis für ein Element auslösen.

Dieses löst das touchstart Ereignis:

var e = document.createEvent('MouseEvent'); 

e.initMouseEvent("touchstart", true, true, window, 1, screenX, screenY, clientX, clientY, 
    ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget); 

target.dispatchEvent(e); 

Beachten Sie, dass die Variablen durch meine Funktion

definiert sind, aber es gibt ein Problem. Das Objekt event verfügt nicht über eine touches Eigenschaft. So etwas wie das wird nicht funktionieren:

var touch = e.touches[0]; 

Gibt es eine Möglichkeit, ein touchstart Ereignis auslösen manuell (es sollte auf Android funktionieren> = 4.0 und Chrome mit Touch-fähigen [DevTools])?

Bitte beachten Sie, dass ich kein Framework wie jQuery verwenden möchte. Mit jQuery es ist einfach, ein touchevent auf ein Element zu erstellen, wie Sie)

+1

Nur für Vernunft, warum müssen Sie ein Ereignis generieren? – Halcyon

+0

Nun, lassen Sie uns sagen, dass ich einen Container habe. Dieser Container hat viele Untercontainer, die versteckt sind. Wenn ich diesen Behälter berühre, wird ein Unterbehälter sichtbar, und solange ich den Behälter berühre, sollte ich den Unterbehälter bewegen können, indem ich meinen Finger bewege. Wenn ich also den Container berühre, sollte ein 'Touchstart'-Event auf dem Subcontainer erstellt werden. – AndreM96

+1

Das klingt nach etwas, das ziemlich einfach sein sollte, ohne Ereignisse zu fälschen. Wenn Ihr Modell die Containerabhängigkeit kennt, können Sie alle über das einzelne ursprüngliche Ereignis steuern. – Halcyon

Antwort

20

Nach W3C

var e = document.createEvent('TouchEvent'); 

Dann auch

e.initMouseEvent(); 

zu

e.initTouchEvent(); 

‘ändern Ich habe ein Ereignis touchstart erstellt.

Der W3C Link sagt:

Some user agents implement an initTouchEvent method as part of the TouchEvent interface. When this method is available, scripts can use it to initialize the properties of a TouchEvent object, including its TouchList properties (which can be initialized with values returned from createTouchList). The initTouchEvent method is not yet standardized, but it may appear in some form in a future specification.

So werden Sie vielleicht zu e.initUIEvent('touchstart', true, true);
Neben greifen, die offizielle Spezifikation stellt auch fest, dass das TouchList Objekt ist optional und kann manuell erstellt werden Verwenden der createTouchList Methode. So fügen Sie einen Touch zu dieser Liste, werden Sie die createTouch Methode aufrufen müssen, wo Sie alle Koordinaten bestehen werden und so:

 
6.1 Methods 

#createTouch 
Creates a Touch object with the specified attributes. 
Parameter | Type  | Nullable | Optional | Description 
view  | WindowProxy | ✘  | ✘  | 
target | EventTarget | ✘  | ✘  | 
identifier| long  | ✘  | ✘  | 
pageX  | long  | ✘  | ✘  | 
pageY  | long  | ✘  | ✘  | 
screenX | long  | ✘  | ✘  | 
screenY | long  | ✘  | ✘  | 
Return type: Touch 

#createTouchList 
Creates a TouchList object consisting of zero or more Touch objects. Calling this method with no arguments creates a TouchList with no objects in it and length 0 (zero). 

Parameter | Type | Nullable | Optional | Description 
touches | Touch |  ✘ | ✔  | 
Return type: TouchList 

Wenn das nicht funktioniert, könnte man dies versuchen:

var e = document.createEvent('UIEvent'); 
e.initUIEvent(); 

funktionieren sollte, macht es mehr Sinn, als createEvent('MouseEvent') jedenfalls ...
aber für Testzwecke, warum nicht öffnen Ihre Chromkonsole und überprüfen Emulate touch events sowie User-Agent außer Kraft setzen 4. (Strg + Umschalt auf Android + j> Klicken Sie auf die untere rechte Ecke des Zahnrads und wählen Sie Ov errides, dort finden Sie alle Einstellungen finden Sie benötigen)

Da die berührungs Ereignisse einen langen Weg zu gehen, noch in Bezug auf ihre standardisiert werden, es stellt sich heraus, die touches Eigenschaft ist nicht RO (noch ?), So dass Sie diese Quick-Fix verwenden können (was die OP mit dem gewünschten Ergebnis gefunden und verwendet):

var e = document.createEvent('TouchEvent'); 
e.touches = [{pageX: pageX, pageY: pageY}]; 

Which, denke ich (ich kann es nicht glauben, wenn es nicht der Fall ist) ist ist schneller als:

e.touches = e.createTouchList(
    e.createTouch(window, target, 0, pageX, pageY, screenX, screenY) 
); 
+0

Zuerst, danke für diese Antwort! :) Ich habe das auch versucht, aber es hat nicht funktioniert ... Es gibt keine gute Dokumentation zu 'createEvent ('TouchEvent')'. :/Und in Chrome bekomme ich diesen Fehler: 'Uncaught Error: NotSupportedError: DOM Exception 9'. Und mit '[DevTools]' in meiner Frage meinte ich, dass ich dev tools touch enabled hatte. ;) – AndreM96

+2

@ AndreM96: Gefunden: das 'TouchList' Objekt ist optional, und Sie müssen manuell ein' Touch' Objekt mit den 'createTouchList' und' createTouch' Methoden bzw. –

+0

erstellen. Danke! Das funktioniert. Ich habe eine einfache Problemumgehung gefunden, die ich jetzt verwende: 'e.touches = [{pageX: pageX, pageY: pageY}];' ('e' ist das erzeugte Ereignis). Aber deine Lösung ist definitiv besser! – AndreM96

-4

Wir mögen diese auslösen können:

$playBtn.bind((is_touch_device) ? 'touchstart' : 'click', playfunction); 
+2

Bitte überprüfen Sie die kurze Beschreibung des JavaScript-Tags: _ "Es sei denn, ein Tag für ein Framework/eine Bibliothek ist ebenfalls enthalten, wird eine reine JavaScript-Antwort erwartet" _, bewegen Sie einfach Ihre Maus darüber. Es gibt kein jQ-Tag, keine jQ-Antworten ... –

+0

Ich habe gerade meine Frage aktualisiert. Ja, ich möchte keine Art von Rahmen verwenden. ;) – AndreM96

4

ich weiß, das beantwortet wurde, aber ich kämpfte auch eine Antwort auf dieses Problem und die akzeptierte Antwort für funktionierte nicht zu finden mich. Am Ende ist die Lösung, die ich gefunden habe, wirklich sehr einfach und hat Unterstützung über Browser hinweg:

Das ist es. Könnte nicht einfacher sein.

+0

was ist das Ziel? – scord

+0

@scord 'target' ist ein Element, das Sie Ihre Veranstaltung für –

+0

versenden möchten Leider mit dem aktuellen Stand der Unterstützung unter den Browsern scheint dies die beste Lösung, obwohl nicht sehr robust. Erstellen Sie einfach ein generisches Ereignis und füllen Sie alle Eigenschaften, die Sie benötigen, manuell aus, als wäre es ein "echtes" Berührungsereignis. –