2012-01-22 6 views
8

Ho attivato iScroll su my page.Come NON-fare clic su un href durante il trascinamento in iScroll

Si noti che le immagini nello scroller sono collegamenti (quindi un popup si apre per l'immagine più grande, si conosce l'accordo). MA una delle fantastiche funzionalità di iScroll è che puoi trascinare il mouse per scorrere. MA ora, quando qualcuno lo trascina, apre automaticamente l'immagine invece di scorrere la barra. C'è una soluzione?

+0

Ho la sensazione che l'immissione di un ascoltatore sui link è la strada da percorrere. Cioè quando viene fatto clic su un collegamento (che accade accidentalmente in questo caso) impedisce il comportamento predefinito, controlla se gli utenti scorrono e se non apre comunque il collegamento? Spero che questo ispiri te o qualcun altro. (Mi piacerebbe sapere se questo è _non_ la strada da percorrere) – Joep

+0

Hai ancora bisogno di iScroll con iOS5 in uscita? Perché non utilizzare '-webkit-overflow-scrolling: touch' – Matijs

+0

Mi piacerebbe avere la stessa funzionalità sia sul desktop che sul cellulare. Questo è l'unico che so che va bene. Secondo le recensioni degli utenti ecc. –

risposta

3

Direi di aggiungere una classe a ogni ancora mentre lo scroller viene trascinato. Ad esempio, aggiungi un nome di classe di "trascinamento" a ciascun ancoraggio mentre viene trascinato, quindi rimuovi la classe durante il trascinamento.

Ciò significa che è possibile aggiungere un preventDefault a qualsiasi collegamento che abbia la classe "trascinamento". Qualcosa sulla falsariga di:

myScroll1 = new iScroll('scroll1', { 
     snap: 'li', 
     momentum: false, 
     hScrollbar: false, 
     onScrollStart: function() { 
      $('div#iscroll1 a').addClass("dragging"); 
     }, 
     onScrollEnd: function() { 
      $('div#iscroll1 a').removeClass("dragging"); 
      document.querySelector('.indicator > li.active').className = ''; 
      document.querySelector('.indicator > li:nth-child(' + (this.currPageX+1) + ')').className = 'active'; 
     } 
    }); 
    $('.dragging').click(function (e) { 
     e.preventDefault(); 
    } 

Questo è il codice però non testato quindi potrebbe essere necessario per perfezionare i selettori.

+0

Anche come nota a margine. Lo scroller non funziona per me in IE8. Muore con un errore: L'oggetto non supporta questa proprietà o metodo Riga: 52 Char: 5 Codice: 0 – Zappa

3

Ho creato una patch per iScroll che risolve questo problema. Si può vedere il diff qui: https://github.com/zmathew/iscroll/commit/3d77681a9f4b3a6b5a7579df4443bc53356d5584

In alternativa si può afferrare l'intera versione modificata di iScroll da qui: https://github.com/zmathew/iscroll/tree/prevent-scroll-clicks

+0

Grazie per la nuova versione con patch! E appena in tempo, fortunata! – Yisela

+2

Esiste una versione di questa patch per la nuova versione di iscroll (4.2)? – Alvaro

-2

Ciao versione qui viene modificato di iScroll 4.2.5 scaricare

iScroll 4.2.5 + click fix

onBeforeScrollStart: function (e) {if(!hasTouch) e.preventDefault();}, 
0

soluzione non ha funzionato per me, ecco la mia semplice soluzione. Impostare il trascinamento su true durante il trascinamento, impostarlo su false quando no. Se fai clic durante il trascinamento, ignoralo.

var myScroll = new iScroll("scroll1", { onBeforeScrollMove: function() { 
      window.dragging = true; 
     }, 
      onScrollEnd: function() { 
       //had to use a timeout here because without it it would fire on links at the end of the drag/dragging slowly 
       setTimeout(function() { 
        window.dragging = false; 
       }, 10); 
      } 

     }); 

e sulle ancore di controllo per trascinare

$(".myanchors a").click(function() { 
     if (window.dragging) { 
      return false; 
     } 
    });