Jquery-ui sortable не работает на сенсорных устройствах на базе Android или IOS

Есть ли какое-либо исправление для сортировки Jquery-ui на сенсорных устройствах на базе 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.

Другой код ведет себя странно, когда вы перетаскиваете элемент, потенциальная позиция падения очень далека от того, как это должно быть.