2015-08-13 18 views
10

Ho un piccolo jsfiddle - http://jsfiddle.net/qhguktsn/5/. Quando tocchi il testo nella parte superiore del collegamento (iOS Mobile Safari), ricevi solo gli eventi del mouse, nessun evento di tocco, nemmeno sul corpo. Se lo tocchi nella parte inferiore del testo, ricevi degli eventi di tocco. Dipendiamo dagli eventi di tocco per gestire un ritardo di 300 ms.Safari che non attiva gli eventi tattili

Come possiamo ottenere gli eventi di tocco per toccare sulla parte superiore del testo e in basso?

HTML:

<div style="margin-left:200px;margin-top:200px"> 
    <a style="vertical-align:center;height: 20px, width: 20px;font-size:100px" href="javascript: void 0">text</a> 
</div> 

JS:

jQuery("a").on("mousedown", function() { document.body.appendChild(document.createTextNode("mousedown ")); }); 
jQuery("a").on("mouseup", function() { document.body.appendChild(document.createTextNode("mouseup ")); }); 
jQuery("a").on("touchstart", function() { document.body.appendChild(document.createTextNode("touchstart ")); }); 
jQuery("a").on("touchend", function() { document.body.appendChild(document.createTextNode("touchend ")); }); 
jQuery("a").on("click", function() { document.body.appendChild(document.createTextNode("click ")); }); 

jQuery(document.body).on("touchstart", function() { document.body.appendChild(document.createTextNode("body touchstart ")); }); 
jQuery(document.body).on("touchend", function() { document.body.appendChild(document.createTextNode("body touchend ")); }); 
+0

Penso che potrei avere la stessa cosa su iOS 8.1.2 con Chrome. – PaukkuPalikka

+0

Chrome utilizza lo stesso motore di rendering di Safari su iOS, quindi il comportamento dovrebbe essere identico (come dovrebbe essere con tutti gli altri browser in esecuzione su iOS). – Luckyrat

+0

Ho cercato di scoprire perché gli eventi di tocco sul mio pulsante piccolo non sparavano in modo coerente e il tuo post mi ha aiutato a capire che si tratta di un problema marginale! Gli eventi tattili non riescono a scattare fintanto che stai toccando troppo vicino a qualsiasi bordo, compresi i bordi sinistro e destro, ma gli eventi click continuano a sparare. –

risposta

1

Il tocco eventi sul corpo sono dovute alla elemento del corpo si sposti verso il basso dalla margin-top, mettendo un contorno sull'elemento corpo delinea il touch-bersaglio:

body { outline: 1px solid red; } 

http://jsfiddle.net/qhguktsn/11/

La seconda parte del mistero sembra essere che l'obiettivo click espande al di fuori del touch-bersaglio:

screenshot of text

Toccando il contorno rosso non si innesca un evento di tocco sull'elemento corpo, ma la l'evento click sembra sparare quando viene toccato ovunque all'interno della regione grigia -webkit-tap-highlight-color che si espande all'esterno dell'ancora stesso. I tocchi nella parte superiore attivano quindi gli eventi di clic sull'ancora, ma non toccano gli eventi sul corpo.

+0

Il problema principale qui è che l'area che è interessata è troppo piccola - nei test reali c'è una banda sostanzialmente più grande nella parte superiore che presenta il problema. – Puppy

+0

Sembra che il browser interpreti il ​​rubinetto come sempre molto più alto di quanto l'utente pensi di aver sfruttato, quindi tra questi due problemi, potrebbe essere questo. – Puppy

+0

@Douglas grazie per aver fatto luce su questo mistero. c'è una soluzione per questo problema? –

6

Questo è noto bug in Mobile Safari. https://bugs.webkit.org/show_bug.cgi?id=105406 C'è anche un altro con l'aggiunta di un modulo di nodo diverso documento. https://bugs.webkit.org/show_bug.cgi?id=135628

Al fine di risolverli ci sono diversi modi.

  • Il primo è quello di utilizzare una piccola libreria chiamata fastclick, che supporta molti dispositivi mobili e sistemi operativi.

  • La seconda opzione è aggiungere event.stopPropagation(); event.preventDefault(); in questo modo. Hai bisogno di entrambi.

    jQuery("a").on("mousedown", function(event) { 
        event.stopPropagation(); 
        event.preventDefault(); 
        document.body.appendChild(document.createTextNode("mousedown ")); 
    }); 
    
  • La terza opzione è quello di utilizzare il meta tag viewport così <meta name="viewport" content="width=device-width, user-scalable=no">. Ciò eliminerà tutti i ritardi di tocco, senza soluzioni alternative. Ma, ancora una volta su Safari potrebbe non agire come negli altri browser, perché ehi Safari is the new IE

C'è anche touch-action, ma non è supportato nella maggior parte dei browser mobili. :(

+0

Non sono davvero convinto di questo bug, poiché stiamo riscontrando un comportamento diverso a seconda di dove sul pulsante si tocca. E le correzioni che hai elencato non si applicano veramente. Fastclick fa esattamente lo stesso di quello che abbiamo fatto, non sono sicuro che la cancellazione di un evento del mouse faccia apparire magicamente un evento di tocco precedente, e la terza opzione, come hai detto, non si applica a Safari, quindi davvero non vedere la rilevanza. – Puppy

+0

Scusa, non potrei essere più utile. Non ho più idee al momento. – Stanimir

+0

Btw, controlla il link in fondo a questo post. http://stackoverflow.com/a/4165641/2855530 – Stanimir

1

Ho trovato che l'evento di tocco non viene attivato quando si fa clic su un elemento contenuto da una posizione: elemento fisso che si estende oltre la finestra. Ho gestito questo rendendo il contenitore genitore più breve (usato JS per ottenere la finestra esatta altezza)

Questo problema era in un'app UIWebview che utilizza iOS 10.(Sì, usando ancora UIWebview)

Problemi correlati