2015-06-04 18 views
38

Ho un problema molto specifico. Sto scrivendo una pagina web per telefoni cellulari con un pulsante. Sto rilevando touchevent su ogni browser incluso IE, ma su IE è abbastanza specifico. Dopo pochi secondi termina automaticamente. Puoi in qualche modo aiutarmi? Qui è il mio codice (modificato uno, ma ancora non funziona correttamente):L'evento Touchstart IE di Windows Phone termina automaticamente dopo pochi secondi

if (window.navigator.pointerEnabled) { 
    tapButton.addEventListener("pointerup", function(e) { 
     e.preventDefault(); 
     addClass(this, 'clicked'); 
     buttonTouched = true; 
    }, false); 
    tapButton.addEventListener("pointerdown", function(e) { 
     e.preventDefault(); 
     removeClass(this, 'clicked'); 
     buttonTouched = false; 
    }, false); 
    alert("pointerEnabled"); 
} 
else if (window.navigator.msPointerEnabled) { 
    tapButton.addEventListener("MSPointerDown", function(e) { 
     e.preventDefault(); 
     addClass(this, 'clicked'); 
     buttonTouched = true; 
    }, false); 
    tapButton.addEventListener("MSPointerUp", function(e) { 
     e.preventDefault(); 
     removeClass(this, 'clicked'); 
     buttonTouched = false; 
    }, false); 
    alert("mspointerEnabled"); 
} 
else { 
    alert("ordinary touch"); 
    tapButton.addEventListener('touchstart', function(e) { 
     e.preventDefault(); 
     addClass(this, 'clicked'); 
     buttonTouched = true; 
    }, false); 
    tapButton.addEventListener('touchend', function(e) { 
     e.preventDefault(); 
     removeClass(this, 'clicked'); 
     buttonTouched = false; 
    }, false); 
} 

E il tag HTML ha in sé:

-ms-touch-action: none !important; 
touch-action: none !important; 

ma questo non aiuta.

+4

Non hai detto quale versione di IE vedi questo, ma vedo che stai rilevando gli eventi con prefisso del venditore prima degli eventi senza prefisso. Per https://msdn.microsoft.com/en-us/library/windows/apps/dn263112.aspx#document_object_model__dom__improvements, le versioni con prefisso sono deprecate e dovrebbero essere utilizzate solo quando le versioni non prefissate non sono disponibili. Forse riordinare le cose ti aiuterà. Le versioni con prefisso, a un certo punto, non funzioneranno più. –

+0

Stavo cercando di risolvere il problema con i prefissi dei produttori ma non ha aiutato :(Ho avuto solo uno senza prefissi e agiva lo stesso :(altri suggerimenti? – gogachinchaladze

+0

Aggiungi snippet di codice funzionante per favore, non puoi capire il tuo problema –

risposta

1

Ho il sospetto che si esegue in un problema di multi-touch ...

Ricordate, toccano gli eventi non sono gli stessi eventi del mouse. Puoi toccare con più di un dito. Cosa succede se si tocca con un dito piuttosto che si aggiunge un secondo dito? Riceverai due eventi consecutivi touchstart. Lo stesso è probabilmente vero per touchend. Ho il sospetto utente light è giusto che probabilmente iniziando una liberazione dito in modo non corretto ...

Si prega di dare un'occhiata a ciò che sta accadendo ai touches, changedTouches e targetTouches proprietà del TouchEvent si ottiene in vostro ascoltatore. Sospetto fortemente che vedrai che c'è ancora un "dito" che tocca ... Quindi è passato da 2 tocchi a 1 ...

Assicurarsi che il dito (non più) toccante sia effettivamente quello che è sul pulsante etc è tutto molto meno semplice rispetto al buon vecchio mouseup e agli eventi mousedown.

EDIT: Mi rendo conto che il tuo problema è con IE e sono gli eventi puntatore ... Tuttavia funzionano in gran parte lo stesso in quanto supportano anche il multi-touch (e potrebbero quindi soffrire gli stessi problemi). Non vedo una proprietà simile a touches, ma vedo uno pointerId, che può darti le stesse informazioni (al costo di un po 'di contabilità da parte tua).

This MSDN page ha alcune buone informazioni. Soprattutto questo frammento di codice è illuminante penso:

function pointerdownHandler(evt) { 
     evt.target.setPointerCapture(evt.pointerId); 
} 

Ciò sembra confermare che, quando un dito colpisce la superficie, il punto di contatto ottiene un ID, che viene utilizzato per informarvi che dito verso sinistra la superficie quando si riceve l'evento pointerup.

Aggiungerei qualche registrazione che stampa lo pointerId su pointerdown e pointerup e scommetto che troverai rapidamente la soluzione.