Jquery-ui sortable不适用于基于Android或IOS的触摸设备

Ale*_*rov 26 iphone android jquery-ui jquery-ui-sortable ios

是否有任何解决办法使Jquery-ui可以在基于Android或IOS的触摸设备上进行排序?

bal*_*and 33

我建议使用jQuery UI Touch Punch.我已经在iOS 5和Android 2.3上测试了它,它在两者上都很好用.

  • 我实际上在使用触摸打孔时遇到了问题.在div上激活draggable和resizabble后,在停用它之后,如果触摸曾经可调整大小或可拖动的div区域,则默认浏览器触摸事件(捏合缩放,滑动以移动屏幕等)事件不再起作用. (4认同)
  • 实际上,这是唯一对我有用的解决方案. (3认同)
  • 这应该是恕我直言的答案 (3认同)

小智 26

另一个答案很棒但不幸的是它只适用于iOS设备.

此外,jquery.ui的更高版本导致了破坏,这意味着_touchEnd事件未正确重置mouse.ui中的内部标志(mouseHandled),这导致异常.

现在应该使用此代码修复这两个问题.

/*
 * 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 );
Run Code Online (Sandbox Code Playgroud)

  • 此代码有效,但它与常规单击(例如对话框的ok按钮)冲突.当用户将手指放在项目上500ms时,是否可以只执行可拖动? (2认同)
  • @Mike - 这听起来像是我也有的问题.我发现只是在上面的代码中删除了对`return false`的调用,这使得click事件在对话框中正常工作 (2认同)
  • @ asgeo1是的,那解决了问题.他们继续使用`return false`,它并没有像大多数人认为的那样做. (2认同)