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

在移动Safari上使用此事件时,触摸时触发事件两次。这是一个已知的错误还是我自己造成的?Backbone.js点击事件不支持触摸

因为我已经把它改为

events: 
    'touchstart' : 'select' 

,它的伟大工程,但同时也意味着它不会在浏览器中正常工作了。

感谢您的任何信息。

回答

1

我不熟悉骨干,但也许尝试设置它的条件?

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

试试这个代码:

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

看到它在行动:http://jsfiddle.net/dira/Ke2px/2/

+0

没有为我工作(在控制台中没有看到任何输出)。骨干事件系统正在工作,因为当我将它改为“click #main”时触发事件。 – Nippysaurus

+0

@Nippysaurus你将需要有自己的代码来检测'MOBILE'。 –

3

我已经使用Modernizr的检测触摸设备和使用下面的代码,这为我工作。

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

工作完美! –

3

我一般通过创建backbone.touch for Backbone将在使用触控设备猴补丁Backbone.View响应触摸事件,或定期点击事件时没有解决同样的问题。

您可以只包含源文件,让它在Backbone.Views中转换所有click事件,或者您可以查看代码并自行实施。

2

我定义这两个事件的类型和它的作品对我来说是移动和桌面上:

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

这将触发“选择”方法两次,因为当你点击触摸屏设备上它激发的所有事件:touchstart touchmove touchend 鼠标悬停鼠标移动 鼠标按下 鼠标松开 点击 – SimplGy

0

使用CoffeeScript的,我会做以下,我从来没有找到一个理由当现在的每个移动设备都是真正的触摸设备时,要引进现代化设备,我的意思是什么时候你最后一次需要真正支持那些没有的东西?

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阅读更好的这些类型的列表解析imho。

0

这对我有用。

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

现在当你测试该设备是否触摸e.type应该touchstart,只有火一次。 用于点击非触摸设备。 如果有人仍然在寻找一个简单的解决方案。