Backbone.js单击事件不适用于触摸

时间:2011-10-19 21:00:15

标签: javascript backbone.js coffeescript

events: 
    'click' : 'select'

在Mobile Safari上使用此事件时,触摸时会触发两次事件。这是一个已知的错误或我自己造成的事情吗?

我已将其更改为

events: 
    'touchstart' : 'select'

它的效果很好,但意味着它不再适用于普通的浏览器。

感谢您的任何信息。

8 个答案:

答案 0 :(得分:16)

试试这段代码:

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

查看实际操作:http://jsfiddle.net/dira/Ke2px/2/

答案 1 :(得分:3)

我使用Modernizr来检测触摸设备并使用以下代码,这对我有用。

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

答案 2 :(得分:3)

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

您可以只包含源文件以使其转换Backbone.Views中的所有click事件,或者您可以查看代码并自行实现。

答案 3 :(得分:2)

我定义了两种事件类型,它适用于移动设备和桌面设备:

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

答案 4 :(得分:1)

我不熟悉Backbone,但也许可以尝试有条件地设置它?

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

答案 5 :(得分:0)

我只是包含了jquery touchpunch库,就是这样。

https://github.com/furf/jquery-ui-touch-punch

答案 6 :(得分: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对于这些类型的列表推导非常好。

答案 7 :(得分: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并且只触发一次。 点击非触摸设备也是如此。 如果有人仍然在寻找一个简单的解决方案。