2013-08-05 15 views
20

Ho cercato negli ultimi 30 minuti, ma non ho trovato una soluzione.attivazione manuale evento touch

Voglio attivare un evento touchstart su un elemento.

Questo genera l'evento touchstart:

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

Si noti che le variabili sono definite dalla mia funzione di

Ma c'è un problema con questo. L'oggetto event non ha una proprietà touches. Quindi, qualcosa come questo non funzionerà:

var touch = e.touches[0]; 

Esiste un modo per attivare manualmente un evento touchstart (dovrebbe funzionare su Android> = 4.0 e Chrome con touch abilitata [DevTools])?

Si prega di notare che NON voglio utilizzare alcun framework come jQuery. Con jQuery è facile creare un touchevent su un elemento;)

+1

Solo per la sanità mentale, perché è necessario generare un evento? – Halcyon

+0

Bene, diciamo che ho un contenitore. Questo contenitore ha molti sottocontenitori che sono nascosti. Quando tocco questo contenitore, diventa visibile un sottocontenitore e fintanto che tocco il contenitore, dovrei essere in grado di spostare il sottocontenitore muovendo il dito. Quindi, quando tocco il contenitore, dovrebbe essere creato un evento "touchstart" sul sottocontenitore. – AndreM96

+1

Sembra qualcosa che dovrebbe essere abbastanza facile da fare senza falsificare gli eventi. Se il tuo modello conosce la dipendenza del contenitore, puoi controllare tutto dal singolo evento originale. – Halcyon

risposta

20

Secondo W3C

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

Poi, cambia anche

e.initMouseEvent(); 

a

e.initTouchEvent(); 

Come si' ho creato un evento touchstart.

Il link W3C dice:

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.

quindi dovrete potrebbe essere necessario ricorrere a e.initUIEvent('touchstart', true, true);
Inoltre, la specifica ufficiale afferma inoltre che l'oggetto è TouchListfacoltativa, e può essere creato manualmente utilizzando il metodo createTouchList. Per aggiungere un tocco a quella lista, dovrete chiamare il metodo createTouch, dove si passa tutte le coordinate e quali:

 
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 

Se questo non dovesse funzionare, si potrebbe provare questo:

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

dovrebbe funzionare, ha più senso di createEvent('MouseEvent') in ogni caso ...
Ma a scopo di test, perché non aprire la console di cromo e verificare Emulate touch events, oltre a ignorare user agent ad Android 4. (Ctrl + shift + j> fai clic sull'ingranaggio in basso a destra e seleziona Ov errides, ci troverete tutte le impostazioni necessarie)

Dal momento che i touch-eventi hanno una lunga strada da fare, ancora in termini di diventare standardizzata, si scopre la proprietà touches è non RO (ancora ?), In modo da poter utilizzare questo quick-fix (che il PO trovato e utilizzato con il risultato desiderato):

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

che, credo (non riesco a credere che se non fosse il caso) è più veloce di:

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

Innanzitutto, grazie per questa risposta! :) Ho provato anche quello, ma non ha funzionato ... Non c'è una buona documentazione su 'createEvent ('TouchEvent')'. :/E in Chrome ho ricevuto questo errore: 'Errore non rilevato: NotSupportedError: DOM Exception 9'. E con '[DevTools]' nella mia domanda intendevo che avevo gli strumenti dev touch abilitati. ;) – AndreM96

+2

@ AndreM96: trovato: l'oggetto 'TouchList' è facoltativo, e dovrai creare manualmente un oggetto' Touch' usando i metodi 'createTouchList' e' createTouch' rispettivamente –

+0

Grazie! Che funzioni. Ho trovato una soluzione semplice che ora uso: 'e.touches = [{pageX: pageX, pageY: pageY}];' ('e' è l'evento creato). Ma la tua soluzione è decisamente migliore! – AndreM96

-4

possiamo innescare in questo modo:

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

Si prega di controllare la breve descrizione del tag JavaScript: _ "A meno che non sia incluso anche un tag per un framework/libreria, è prevista una risposta JavaScript pura" _, basta passare il mouse sopra di esso. Non c'è tag jQ, non risposte jQ ... –

+0

Ho appena aggiornato la mia domanda. Sì, non voglio usare nessun tipo di framework. ;) – AndreM96

4

so che questo è stato risposto, ma troppo ho faticato a trovare una risposta a questo problema e la risposta accettata non ha funzionato per me. Alla fine, la soluzione che ho trovato è davvero molto semplice e supporta i browser:

var e = new Event('touchstart'); 
target.dispatchEvent(e); 

Questo è tutto. Non potrebbe essere più facile

+0

qual è l'obiettivo? – scord

+0

@scord 'target' è un elemento per il quale vuoi inviare il tuo evento per –

+0

Sfortunatamente con il livello attuale di supporto tra i browser questa sembra essere la soluzione più valida, anche se non molto robusta. Basta creare un evento generico e riempire manualmente tutte le proprietà necessarie come se si trattasse di un evento di tocco "reale". –

Problemi correlati