2011-10-19 3 views
9
events: 
    'click' : 'select' 

Quando si utilizza questo evento su Mobile Safari, l'evento viene attivato due volte quando viene toccato. È un bug noto o qualcosa che sto causando da solo?L'evento Clickbone.js non funziona con il tocco

allora ho cambiato in

events: 
    'touchstart' : 'select' 

e funziona benissimo, ma significa che non funzionerà nei browser normali più.

Grazie per qualsiasi informazione.

risposta

1

Non ho familiarità con Backbone, ma forse provare a impostarlo in modo condizionale?

if ('ontouchstart' in document.documentElement) { 
    // 'touchstart': 'select' 
} else { 
    // 'click': 'select' 
} 
16

provare questo codice:

TouchView = Backbone.View.extend({ 
    events: function() { 
    return MOBILE ? 
     { 
     "touchstart": 'select' 
     } : 
     { 
     "mousedown": 'select' 
     } 
    } 
} 

vederlo in azione: http://jsfiddle.net/dira/Ke2px/2/

+0

Non ha funzionato per me (non ha visto nulla di output in console). Il sistema di eventi di backbone funzionava però perché l'evento si è attivato quando l'ho modificato per "fare clic su #main". – Nippysaurus

+0

@Nippysaurus è necessario disporre del proprio codice per rilevare 'MOBILE'. –

3

ho usato Modernizr per rilevare il dispositivo touch e utilizzare secondo il codice e questo ha funzionato per me.

events :function(){ 
    return Modernizr.touch ? 
    { 
     "touchstart #edit" : "openEdit", 
    }: 
    { 
     "click #edit" : "openEdit", 
    } 
} 
+0

ha funzionato perfettamente! –

3

Ho risolto lo stesso problema genericamente con la creazione di backbone.touch for Backbone che sarà scimmia cerotto Backbone.View per rispondere a toccare gli eventi quando si utilizza un dispositivo touch, o eventi click regolari quando no.

Puoi semplicemente includere il file sorgente per trasformare tutti gli eventi click in Backbone.Views, oppure puoi dare uno sguardo al codice e implementarlo tu stesso.

2

ho definito entrambi i tipi di eventi e funziona per me su un mobile e desktop:

events: { 
'click' : 'select', 
'touchstart' : 'select' 
} 
+3

che il fuoco il metodo di 'selezionare' due volte, dal momento che quando si tocca su un dispositivo touch si spara tutti gli eventi: TouchStart touchmove touchend mouseover mousemove mousedown mouseup click – SimplGy

0

Utilizzando CoffeeScript, farei quanto segue, non ho mai trovato un motivo per portare in modernizzatore quando ogni dispositivo mobile in questi giorni è davvero un dispositivo touch, voglio dire quando è stata l'ultima volta che hai dovuto supportare davvero qualcosa che non lo facesse?

window.isTouchDevice = (/android|webos|iphone|ipod|ipad|blackberry|iemobile/i.test(navigator.userAgent.toLowerCase())) 

    events: -> 
    for k, v of this when /click/.test(k) and isTouchDevice 
     mobileKey = k.replace('click','touchstart') 
     events[ mobileKey ] = v 
     delete events[ k ] 
    return events 

Coffeescript si legge meglio per questo tipo di comprensione delle liste imho.

0

questo ha funzionato per me.

events:{ 
    'click #edit':'select', 
    'touchstart #edit':'select' 
}, 
select: function(e){ 
    e.stopPropagation(); 
    e.preventDefault(); 
    console.log('open upload dialog ', e.type); 
} 

ora quando si verifica questo se il dispositivo è touch e.type dovrebbe essere touchstart e solo sparare una volta. Lo stesso per il clic sul dispositivo no-touch. Nel caso qualcuno stia ancora cercando una soluzione semplice per questo.