#javascript #drag-and-drop #mobile-safari #dom-events #mootools
#javascript #перетаскивание #mobile-safari #dom-события #mootools
Вопрос:
Есть ли способ заставить класс mootools «Перетаскивать» на Safari mobile? Пожалуйста, не связывайте меня с другими фреймворками.
Ответ №1:
Вот мое решение, как заставить Mootools Drag поддерживать события касания. Этот метод не требовал от меня дополнительного редактирования файла mootools, поскольку я использовал Class.refactor (это тестируется только с Mootools v.1.3.1) — он также не нарушает обычные события щелчка
Class.refactor(Drag,
{
attach: function(){
this.handles.addEvent('touchstart', this.bound.start);
return this.previous.apply(this, arguments);
},
detach: function(){
this.handles.removeEvent('touchstart', this.bound.start);
return this.previous.apply(this, arguments);
},
start: function(event){
document.body.addEvents({
touchmove: this.bound.check,
touchend: this.bound.cancel
});
this.previous.apply(this, arguments);
},
check: function(event){
if (this.options.preventDefault) event.preventDefault();
var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) Math.pow(event.page.y - this.mouse.start.y, 2)));
if (distance > this.options.snap){
this.cancel();
this.document.addEvents({
mousemove: this.bound.drag,
mouseup: this.bound.stop
});
document.body.addEvents({
touchmove: this.bound.drag,
touchend: this.bound.stop
});
this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element);
}
},
cancel: function(event){
document.body.removeEvents({
touchmove: this.bound.check,
touchend: this.bound.cancel
});
return this.previous.apply(this, arguments);
},
stop: function(event){
document.body.removeEvents({
touchmove: this.bound.drag,
touchend: this.bound.stop
});
return this.previous.apply(this, arguments);
}
});
Комментарии:
1. потрясающе, 1 — если это было протестировано на производстве и работает, почему бы не изменить исходные классы и вместо этого отправить запрос на извлечение в mootools-more? сенсорные устройства гораздо более распространены, и это полезно иметь из коробки.
2. Отлично!! знаете ли вы, как отключить прокрутку во время перетаскивания события касания? Мое окно прокручивается одновременно с перетаскиванием…
3. На самом деле существует проблема из-за ошибки Android, см. uihacker . blogspot.it/2011/01/android-touchmove-event-bug.html и code.google.com/p/android/issues/detail?id=5491 . По сути, вам нужно вызвать event.preventDefault() в обратном вызове touchmove, а затем настроить параметры, чтобы правильно удалить обработчик событий
Ответ №2:
Я сам это исправил. Это так же просто, как сопоставить события мыши с событиями касания.
Итак, решение заключается в поиске и замене:
mousedown -> touchstart
mouseup -> touchend
mousemove -> touchmove
Ответ №3:
Не могли бы вы попробовать https://github.com/kamicane/mootools-touch ?
Комментарии:
1. Это для mootools 1.2, а я использую 1.3. Также я использую много компонентов, основанных на собственном классе Drag, поэтому я предпочитаю исправление для этого класса. Спасибо!