web-dev-qa-db-ja.com

jquery-ui sortableは、AndroidまたはIOS

AndroidまたはIOSに基づいてタッチデバイスでJquery-uiのソートを可能にするための修正はありますか?

26
Alexey Zakharov

他の答え は素晴らしいですが、残念ながら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 );
26
John Hardy

jQuery UI Touch Punch をお勧めします。私はiOS 5とAndroid 2.3でテストしましたが、両方でうまく動作します。

32
balexand

ドラッグハンドルで機能するソリューションをようやく見つけました。

  1. このページ に移動します。
  2. ダウンロードで、「altfix」バージョンを取得します。これは、指定した要素にタッチ処理のみを適用します。
  3. ダウンロードしたJSファイルのスクリプトタグを追加します。
  4. ドキュメント準備ハンドラーのドラッグハンドルにタッチ処理を追加します。例えば$('.handle').addTouch()
3
phatmann

以下のスニペットをjquery-sortableと組み合わせて使用​​しています。これにより、iPhoneでドラッグソートを実行できます。最初のソートを完了した後、リストでのスクロールがドラッグとして検出されるため、問題が発生します。

編集-ここも参照 http://bugs.jqueryui.com/ticket/414 編集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 );
2
Bryan

これは、mouse.uiのjsコードを置き換えるものですか、それともそのJavaScriptがロードされた後に呼び出されるものですか? Androidタブレットで動作させることができません。

将来的にこれを見つけた人のために編集します-これを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 );
2
Bill Martino

これは選択した回答よりもはるかにうまく機能したので、これが他の人の役に立つことを願っています。

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

他のコードは奇妙な振る舞いをします。要素をドラッグすると、潜在的なドロップ位置は本来あるべき位置から遠く離れています。

1
Carlos Mafla