Событие нажатия Backbone.js не работает с сенсорным - PullRequest
9 голосов
/ 20 октября 2011
events: 
    'click' : 'select'

При использовании этого события в Mobile Safari событие срабатывает дважды при касании. Это известная ошибка или что-то, что я вызываю самостоятельно?

С тех пор я изменил его на

events: 
    'touchstart' : 'select'

и он прекрасно работает, но это означает, что он больше не будет работать в обычных браузерах.

Спасибо за любую информацию.

Ответы [ 8 ]

16 голосов
/ 20 октября 2011

Попробуйте этот код:

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

Посмотреть в действии: http://jsfiddle.net/dira/Ke2px/2/

3 голосов
/ 03 декабря 2012

Я решил ту же проблему в общем, создав backbone.touch для Backbone , которая будет обезьяна исправлять Backbone.View, чтобы реагировать на сенсорные события, когда используется сенсорное устройство, или обычные события нажатия, если нет.

Вы можете либо просто включить исходный файл, чтобы он преобразовал все ваши click события в Backbone.Views, либо взглянуть на код и реализовать его самостоятельно.

3 голосов
/ 05 ноября 2012

Я использовал Modernizr для обнаружения сенсорного устройства и использовал следующий код, и это сработало для меня.

events :function(){ 
   return Modernizr.touch ? 
     {
         "touchstart #edit" : "openEdit",
     }: 
     {
         "click #edit" : "openEdit",
     }
 }
2 голосов
/ 08 мая 2013

Я определил оба типа событий, и он работает для меня на мобильном и настольном компьютере:

events: {
'click' : 'select',
'touchstart' : 'select'
}
1 голос
/ 20 октября 2011

Я не знаком с Backbone, но, возможно, попробуйте установить его условно?

if ('ontouchstart' in document.documentElement) {
  // 'touchstart': 'select'
} else {
  // 'click': 'select'
}
0 голосов
/ 04 декабря 2015

это сработало для меня.

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

теперь, когда вы проверяете это, если устройство сенсорное, e.type должно быть сенсорным запуском и срабатывать только один раз.То же самое для клика на устройстве без сенсорного экрана.На случай, если кто-то все еще ищет простое решение для этого.

0 голосов
/ 22 декабря 2014

Используя 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 голосов
/ 04 декабря 2012

Я просто включил библиотеку jquery touchpunch и все.

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

...