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

Al usar este evento en Mobile Safari, el evento se activa dos veces al tocarlo. ¿Es este un error conocido o algo que estoy causando por mi cuenta?El evento de clic de Backbone.js no funciona con touch

desde entonces he cambiado a

events: 
    'touchstart' : 'select' 

y funciona muy bien, pero significa que no va a funcionar en los navegadores normales nunca más.

Gracias por cualquier información.

Respuesta

1

No estoy familiarizado con Backbone, pero quizás intente configurarlo condicionalmente?

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

probar este código:

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

verlo en acción: http://jsfiddle.net/dira/Ke2px/2/

+0

No funcionó para mí (no vi ningún resultado en la consola). Sin embargo, el sistema de eventos de red troncal estaba funcionando porque el evento se activó cuando lo cambié a "cliC#main". – Nippysaurus

+0

@Nippysaurus necesitarás tener tu propio código para detectar 'MÓVIL '. –

3

he utilizado Modernizr para detectar el dispositivo táctil y utiliza después de código y esto funcionó para mí.

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

¡Funcionó a la perfección! –

3

he resuelto el mismo problema genéricamente mediante la creación de backbone.touch for Backbone que será mono parche Backbone.View a responder al tacto eventos cuando se utiliza un dispositivo táctil, o eventos regulares clic cuando no.

Puede incluir el archivo fuente para que transforme todos sus eventos click en Backbone.Views, o puede echar un vistazo al código e implementarlo usted mismo.

2

he definido dos tipos de eventos y funciona para mí en un móvil y de escritorio:

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

que encenderá el método de 'seleccionar' dos veces, ya que al tocar en un dispositivo táctil que dispara todos los eventos: touchstart touchmove touchend encima del ratón mousemove mousedown mouseup clic – SimplGy

0

Usando CoffeeScript, yo haría lo siguiente, no siempre encontrar una razón traer un modernizador cuando cada dispositivo móvil en estos días es realmente un dispositivo táctil, me refiero a cuándo fue la última vez que tuviste que apoyar realmente algo que no lo hizo?

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 lee mejor para este tipo de listas por comprensión imho.

0

esto funcionó para mí.

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

ahora cuando lo prueba si el dispositivo es táctil e.type debe activarse y solo disparar una vez. Lo mismo para hacer clic en el dispositivo sin contacto. En caso de que alguien todavía esté buscando una solución simple para esto.

Cuestiones relacionadas