Есть ли какое-либо исправление для сортировки Jquery-ui на сенсорных устройствах на базе Android или IOS?
Jquery-ui sortable не работает на сенсорных устройствах на базе Android или IOS
Ответ 1
Другой ответ замечательный, но, к сожалению, он будет работать только на устройствах iOS.
Также произошел обрыв, вызванный более поздними версиями jquery.ui, что означало, что события _touchEnd не правильно сбросили внутренний флаг (mouseHandled) в mouse.ui, и это вызывало исключения.
Теперь обе эти проблемы должны быть исправлены с помощью этого кода.
/*
* Content-Type:text/javascript
*
* A bridge between iPad and iPhone touch events and jquery draggable,
* sortable etc. mouse interactions.
* @author Oleg Slobodskoi
*
* modified by John Hardy to use with any touch device
* fixed breakage caused by jquery.ui so that mouseHandled internal flag is reset
* before each touchStart event
*
*/
(function( $ ) {
$.support.touch = typeof Touch === 'object';
if (!$.support.touch) {
return;
}
var proto = $.ui.mouse.prototype,
_mouseInit = proto._mouseInit;
$.extend( proto, {
_mouseInit: function() {
this.element
.bind( "touchstart." + this.widgetName, $.proxy( this, "_touchStart" ) );
_mouseInit.apply( this, arguments );
},
_touchStart: function( event ) {
if ( event.originalEvent.targetTouches.length != 1 ) {
return false;
}
this.element
.bind( "touchmove." + this.widgetName, $.proxy( this, "_touchMove" ) )
.bind( "touchend." + this.widgetName, $.proxy( this, "_touchEnd" ) );
this._modifyEvent( event );
$( document ).trigger($.Event("mouseup")); //reset mouseHandled flag in ui.mouse
this._mouseDown( event );
return false;
},
_touchMove: function( event ) {
this._modifyEvent( event );
this._mouseMove( event );
},
_touchEnd: function( event ) {
this.element
.unbind( "touchmove." + this.widgetName )
.unbind( "touchend." + this.widgetName );
this._mouseUp( event );
},
_modifyEvent: function( event ) {
event.which = 1;
var target = event.originalEvent.targetTouches[0];
event.pageX = target.clientX;
event.pageY = target.clientY;
}
});
})( jQuery );
Ответ 2
Я предлагаю jQuery UI Touch Punch. Я тестировал его на iOS 5 и Android 2.3, и он отлично работает на обоих.
Ответ 3
Наконец, я нашел решение, которое работает с ручками перетаскивания.
- Перейдите в эту страницу.
- В "Загрузках" возьмите "altfix" версию, которая применит только сенсорную обработку к указанным вами элементам.
- Добавьте тег script для загруженного JS файла.
- Добавить обработку дескрипторов для ваших ручек перетаскивания в обработчике документов; например
$('.handle').addTouch()
Ответ 4
означает ли это заменить код mouse.ui js или вызываться после загрузки javascript? Я не могу заставить его работать для меня на планшете Android.
EDIT для тех, кто найдет это в будущем - получил это, чтобы работать на планшете Samsung Galaxy Android со следующим кодом:
/iPad|iPhone|Android/.test( navigator.userAgent ) && (function( $ ) {
var proto = $.ui.mouse.prototype,
_mouseInit = proto._mouseInit;
$.extend( proto, {
_mouseInit: function() {
this.element
.bind( "touchstart." + this.widgetName, $.proxy( this, "_touchStart" ) );
_mouseInit.apply( this, arguments );
},
_touchStart: function( event ) {
/* if ( event.originalEvent.targetTouches.length != 1 ) {
return false;
} */
this.element
.bind( "touchmove." + this.widgetName, $.proxy( this, "_touchMove" ) )
.bind( "touchend." + this.widgetName, $.proxy( this, "_touchEnd" ) );
this._modifyEvent( event );
$( document ).trigger($.Event("mouseup")); //reset mouseHandled flag in ui.mouse
this._mouseDown( event );
//return false;
},
_touchMove: function( event ) {
this._modifyEvent( event );
this._mouseMove( event );
},
_touchEnd: function( event ) {
this.element
.unbind( "touchmove." + this.widgetName )
.unbind( "touchend." + this.widgetName );
this._mouseUp( event );
},
_modifyEvent: function( event ) {
event.which = 1;
var target = event.originalEvent.targetTouches[0];
event.pageX = target.clientX;
event.pageY = target.clientY;
}
});
})( jQuery );
Ответ 5
Я использую этот фрагмент ниже в сочетании с jquery-sortable, который позволяет перетаскивать сортировку на моем iPhone. У меня возникла проблема после того, как я закончил первый вид, но поскольку любая прокрутка в списке вообще обнаружена как перетаскивание.
EDIT - см. здесь http://bugs.jqueryui.com/ticket/4143 EDIT 2 - мне удалось получить эту работу, если я использую всю строку в качестве дескриптора. Это также устранило проблему, с которой я сталкивался, когда смещение было неправильным после прокрутки.
/*
* A bridge between iPad and iPhone touch events and jquery draggable, sortable etc. mouse interactions.
* @author Oleg Slobodskoi
*/
/iPad|iPhone/.test( navigator.userAgent ) && (function( $ ) {
var proto = $.ui.mouse.prototype,
_mouseInit = proto._mouseInit;
$.extend( proto, {
_mouseInit: function() {
this.element
.bind( "touchstart." + this.widgetName, $.proxy( this, "_touchStart" ) );
_mouseInit.apply( this, arguments );
},
_touchStart: function( event ) {
if ( event.originalEvent.targetTouches.length != 1 ) {
return false;
}
this.element
.bind( "touchmove." + this.widgetName, $.proxy( this, "_touchMove" ) )
.bind( "touchend." + this.widgetName, $.proxy( this, "_touchEnd" ) );
this._modifyEvent( event );
this._mouseDown( event );
return false;
},
_touchMove: function( event ) {
this._modifyEvent( event );
this._mouseMove( event );
},
_touchEnd: function( event ) {
this.element
.unbind( "touchmove." + this.widgetName )
.unbind( "touchend." + this.widgetName );
this._mouseUp( event );
},
_modifyEvent: function( event ) {
event.which = 1;
var target = event.originalEvent.targetTouches[0];
event.pageX = target.clientX;
event.pageY = target.clientY;
}
});
})( jQuery );
Ответ 6
Это работало намного лучше для меня, чем выбранный ответ, поэтому я надеюсь, что это поможет другим людям:
http://code.google.com/p/rsslounge/source/browse/trunk/public/javascript/addtouch.js?r=115.
Другой код ведет себя странно, когда вы перетаскиваете элемент, потенциальная позиция падения очень далека от того, как это должно быть.