2011-10-13 5 views
5

Ho un'applicazione basata sul Web che include un componente che l'utente può scorrere su e giù con il dito. Uso il metodo preventDefault dell'evento per impedire il comportamento predefinito in cui il tocco sposta sposta l'intero schermo sui dispositivi iOS.Come impedire il comportamento predefinito dell'evento touchmove in iOS 5?

Purtroppo questo non sembra funzionare più in iOS 5, che ho appena aggiornato a questa mattina. Devo supporre che questo sia fatto in modo diverso in iOS 5, ma devo ancora essere in grado di trovare una risorsa che fornisce istruzioni.

Grazie!

Aggiornamento n. 1: non sono stato in grado di trovare una risposta alla mia domanda specifica, ma sono stato in grado di regolare un po 'il mio codice per utilizzare lo stile di scorrimento -webkit-overflow (impostato su un valore di "touch" ") e implementa la snervante capacità di scorrimento inerziale (dove il contenuto scorre più veloce a seconda della velocità del tuo scorrimento e rimbalza" elastico "indietro se colpisce i confini.) Aspetto molto bello ...

Aggiornamento # 2: Ho un altro strano problema ora, per qualche strana ragione che il comportamento di scorrimento a sfioro si confonde a volte per cui devi trascinare il dito a sinistra ea destra sull'elemento che lo contiene per far sì che il suo contenuto si muova su e giù. per capire perché questo accade - qualcuno ha qualche idea ???

risposta

6

In primo luogo, posso verificare che e.preventDefault() disabilita tutti lo scorrimento in iOS 5 utilizzando il seguente codice:

document.ontouchmove = function(e){ e.preventDefault(); } 

Purtroppo, però, questo disabilita lo scorrimento in caso di overflow: scroll div. (Se qualcuno ha una soluzione che lascia lo scorrimento dell'elemento interno abilitato, si prega di condividere.)

Per quanto riguarda l'aggiornamento n. 2, ho notato un comportamento strano quando c'è un elemento scorrevole annidato in un altro elemento scorrevole (inclusa la pagina stessa). A volte il dispositivo esita su quale elemento l'utente intende scorrere. In particolare ho notato questo problema usando la posizione: fissa. La mia soluzione era assicurarsi che il corpo avesse il 100% di altezza e che gli elementi scorrevoli usassero la posizione: assoluta dove possibile.

+0

forse si potrebbe fare un po 'di logica controllo come 'if ($ (e.currentTarget) css ('overflow') = 'scroll'!) e .preventDefault(); '. Dal momento che document.ontouchmove sparerà dopo che l'elemento scileble è stato premuto, è possibile eseguire 'el.ontouchmove = function() {allowScroll = true}' e quindi fare in modo che 'document.ontouchmove' utilizzi quel valore per determinare l'azione e quindi reimpostare il valore a falso –

+0

@BrianNickel Grazie per il suggerimento. Questo è un passo nella giusta direzione che ti consentirà di evitare lo scorrimento diretto su base elemento per elemento (incluso lo scorrimento diretto sul corpo), ma se l'utente tocca un elemento scorrevole che è già sul bordo del suo scrollabile gamma, finirà comunque per scorrere il corpo (mostrando la biancheria grigia sotto). Forse l'unico modo è quello di interpretare la direzione del touchmove e verificare se l'elemento è al limite del suo raggio di scorrimento? –

+0

@RyanRapp Grazie per la risposta.Forse non ho descritto abbastanza chiaramente di quale comportamento sto parlando. Con iOS 4 userei e.preventDefault() all'interno di un elemento (ad esempio, un DIV) con il gestore di eventi touchmove di overflow in modo tale da poter spostare il contenuto intorno tramite il posizionamento assoluto basato sul movimento del dito all'interno dell'elemento. Ora e.preventDefault() lo blocca quando provo a muovere il dito l'intera pagina, che non ha abbastanza contenuti da far scorrere, non scorre tanto ma si sposta in modo da poter vedere la trama dello sfondo di Safari dietro di essa. – natlee75

7

Ho trovato una soluzione molto semplice. Quando l'evento colpisce il tuo elemento che può scorrere, basta aggiungere un flag all'evento. Sul listener di eventi sul documento basta controllare se è impostato il flag e solo di fermare la manifestazione se il flag non è impostato:

this.$scrollableEl.on('touchmove', function(event){ 
    event.comesFromScrollable = true; 
    //when you have containers that are srollable but 
    //doesn't have enough content to scroll sometimes: 
    //event.comesFromScrollable = el.offsetHeight < el.scrollHeight; 
}) 

$document.on('touchmove', function(event){ 
    if(!event.comesFromScrollable){ 
     event.preventDefault() 
    } 
    }) 

Si potrebbe anche usare event.stopImmediatePropagation, invece, in modo da non avete bisogno della eventListener sul documento elemento, ma questo si rompe zepto.js tap nel mio caso:

this.$scrollableEl.on('touchmove', function(event){ 
    event.stopImmediatePropagation() 
}) 
+0

Grazie! Funziona come un fascino! L'ho modificato nel modo in cui aggiungo un attributo dati personalizzato e, se questo è disponibile, lo scorrimento non verrà interrotto. in questo modo possiamo salvare un eventlistener :) –

Problemi correlati