Ответ 1
Супер простое решение для этого. Хотел бы я сказать, что это было очень просто найти, но нет... это заняло некоторое время.
Чтобы прояснить симптом, это то, что первоначально перетаскиваемый элемент всегда тот, который перетаскивается при последующих перетаскиваниях. Если вы начнете перетаскивать b
, при последующих перетаскиваниях b
будет та, которая всегда перемещается. Аналогично для a
и c
.
Это заставило меня спросить, возможно ли, что событие "переработано". Я подтвердил, что значения pageX
и pageY
были правильными в событии touchstart
(и touchmove
), но значения, попадающие в _mouseDown
в Sortable, были неправильными. Итак, я пошел в jquery.ui.mouse.js
и посмотрел там _mouseDown
. Я подтвердил, что соответствующие значения прошли, но что обработчик вышел из этой строки в верхней части метода:
// don't let more than one widget handle mouseStart
if( mouseHandled ) { return };
Итак, я начал смотреть на mouseHandled
. Была только одна строка, где это было reset назад к false
- следующий слушатель вверху:
$( document ).mouseup( function( e ) {
mouseHandled = false;
});
Я понял, что должен быть рядом. Я просмотрел метод _touchEnd
в надстройке совместимости, который вы используете:
_touchEnd: function(event) {
this.element.unbind("touchmove." + this.widgetName).unbind("touchend." + this.widgetName);
this._mouseUp(event);
},
Обратите внимание, что _mouseUp
вызывается только сам виджет, а не document
! Таким образом, ясно, что mouseHandled
никогда не был reset. Итак, я добавил строку document
для отправки _touchEnd
:
_touchEnd: function(event) {
this.element.unbind("touchmove." + this.widgetName).unbind("touchend." + this.widgetName);
this._mouseUp(event);
$(document).trigger('mouseup', event);
},
И престо, все работало правильно.
Итак, в общем, эта одна строка является магической:
$(document).trigger('mouseup', event);
Рабочая вилка здесь [прямая ссылка для просмотра iOS].
Примечание. Я также изменил эту строку:
/ iPad | iPhone /.test(navigator.userAgent) && (function($) {
To:
/iPad|iPhone|iPod/.test(navigator.userAgent) && (function($) {
Потому что он не работал должным образом с пробелами, и вы должны включить поддержку iPod touch.