Jquery-ui sortable doesn't work on touch devices based on Android or IOS

前端 未结 6 1099
盖世英雄少女心
盖世英雄少女心 2020-12-01 02:30

Is there any fix to make Jquery-ui sortable work on touch devices based on Android or IOS?

相关标签:
6条回答
  • 2020-12-01 02:41

    The other answer is great but unfortunately it will only work on iOS devices.

    Also there was is a breakage caused by later versions of jquery.ui that meant that _touchEnd events were not correctly resetting an internal flag (mouseHandled) in mouse.ui and this was causing exceptions.

    Both of these problems should now be fixed with this code.

    /*
     * 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 );
    
    0 讨论(0)
  • 2020-12-01 02:42

    I finally found a solution that works with drag handles.

    1. Go to this page.
    2. In Downloads, grab the "altfix" version, which only applies touch handling to the elements you specify.
    3. Add a script tag for the downloaded JS file.
    4. Add touch handling for your drag handles in your document ready handler; e.g. $('.handle').addTouch()
    0 讨论(0)
  • 2020-12-01 02:45

    I suggest jQuery UI Touch Punch. I've tested it on iOS 5 and Android 2.3 and it works great on both.

    0 讨论(0)
  • 2020-12-01 02:54

    This worked a lot better for me than the selected answer, so I hope this helps other people:

    http://code.google.com/p/rsslounge/source/browse/trunk/public/javascript/addtouch.js?r=115.

    The other code behaves weird, when you drag an element the potential dropping position is very far from were it should be.

    0 讨论(0)
  • I'm using this snippet below in conjunction with jquery-sortable which does allow the drag sort to happen on my iPhone. I am having a problem after I finish the first sort however as any scrolling on the list at all is detected as a drag.

    EDIT - see here as well http://bugs.jqueryui.com/ticket/4143 EDIT 2 - I was able to get this working if I use the entire row as the handle. It also fixed a problem I was having where the offset was incorrect after scrolling.

    /*
     * 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 );
    
    0 讨论(0)
  • 2020-12-01 02:59

    is this meant to replace the mouse.ui js code or to be called after that javascript is loaded? I am unable to get it to work for me on an Android tablet.

    EDIT for anyone finding this in the future - got this to work for a Samsung Galaxy Android tablet with the following code:

        /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 );
    
    0 讨论(0)
提交回复
热议问题