jQuery UI 'draggable()' divをタッチスクリーン用にドラッグ可能にするにはどうすればよいですか?


112

draggable()FirefoxとChromeで動作するjQuery UI があります。ユーザーインターフェイスのコンセプトは、基本的にクリックして「ポストイット」タイプのアイテムを作成することです。

基本的に、クリックdiv#everythingをリッスンする(高さと幅が100%)をクリックまたはタップすると、テキスト入力エリアが表示されます。あなたはテキストを追加し、それが終わったらそれを保存します。この要素をドラッグできます。これは通常のブラウザで機能しますが、iPadではアイテムをドラッグできないのでテストできます。タッチして選択すると(少し暗くなる)、ドラッグできなくなります。左右にドラッグしません。私がすることができます上下にドラッグが、私は個人をドラッグしていないよdiv、私は、全体のWebページをドラッグしています、。

クリックをキャプチャするために使用するコードは次のとおりです。

$('#everything').bind('click', function(e){
    var elem = document.createElement('DIV');
    STATE.top = e.pageY;
    STATE.left = e.pageX;
    var e = $(elem).css({
        top: STATE.top,
        left: STATE.left
    }).html('<textarea></textarea>')
    .addClass('instance')
    .bind('click', function(event){
        return false;
    });
    $(this).append(e);
});

そして、これが私がメモを「保存」して入力divを単なる表示divに変えるために使用するコードです:

$('textarea').live('mouseleave', function(){
    var val = jQuery.trim($(this).val());
    STATE.content = val;
    if (val == '') {
        $(this).parent().remove();
    } else {
        var div  = $(this).parent();
        div.text(val).css({
            height: '30px'
        });
        STATE.height = 30;
        if ( div.width() !== div[0].clientWidth || div.height () !== div[0].clientHeight ) {
            while (div.width() !== div[0].clientWidth || div.height () !== div[0].clientHeight) {
                var h = div.height() + 10;
                STATE.height = h;
                div.css({
                    height: (h) + 'px'
                });     // element just got scrollbars
            }
        }
        STATE.guid = uniqueID()
        div.addClass('savedNote').attr('id', STATE.guid).draggable({
            stop: function() {
                var offset = $(this).offset();
                STATE.guid = $(this).attr('id');
                STATE.top = offset.top;
                STATE.left = offset.left;
                STATE.content = $(this).text();
                STATE.height = $(this).height();
                STATE.save();
            }
        });
        STATE.save();
        $(this).remove();
    }
});

保存したメモのページを読み込むと、次のコードが表示されます。

$('.savedNote').draggable({
    stop: function() {
        STATE.guid = $(this).attr('id');
        var offset = $(this).offset();
        STATE.top = offset.top;
        STATE.left = offset.left;
        STATE.content = $(this).text();
        STATE.height = $(this).height();
        STATE.save();
    }
});

私のSTATEオブジェクトはメモの保存を処理します。

オンロード、これはhtml本文全体です:

<body> 
    <div id="everything"></div> 
<div class="instance savedNote" id="iddd1b0969-c634-8876-75a9-b274ff87186b" style="top:134px;left:715px;height:30px;">Whatever dude</div> 
<div class="instance savedNote" id="id8a129f06-7d0c-3cb3-9212-0f38a8445700" style="top:131px;left:347px;height:30px;">Appointment 11:45am</div> 
<div class="instance savedNote" id="ide92e3d13-afe8-79d7-bc03-818d4c7a471f" style="top:144px;left:65px;height:80px;">What do you think of a board where you can add writing as much as possible?</div> 
<div class="instance savedNote" id="idef7fe420-4c19-cfec-36b6-272f1e9b5df5" style="top:301px;left:534px;height:30px;">This was submitted</div> 
<div class="instance savedNote" id="id93b3b56f-5e23-1bd1-ddc1-9be41f1efb44" style="top:390px;left:217px;height:30px;">Hello world from iPad.</div> 

</body>

だから、私の質問は本当に:iPadでこれをよりよく機能させるにはどうすればよいですか

私はjQuery UIに設定していません、これがjQuery UIまたはjQueryで間違っているのか、またはクロスプラットフォーム/下位互換性のあるdraggable()要素を実行するためのより良いフレームワークがあるかどうか疑問に思っていますタッチスクリーンUIで動作します。

このようなUIコンポーネントの作成方法に関するより一般的なコメントも歓迎します。

ありがとう!


更新: これをjQuery UI draggable()呼び出しにチェーンして、iPadで正しいドラッグ機能を取得することができました!

.touch({
    animate: false,
    sticky: false,
    dragx: true,
    dragy: true,
    rotate: false,
    resort: true,
    scale: false
});

jQueryのタッチプラグインは、トリックをしました!


1
何かに興味があります。2本または3本の指でdivをドラッグできますか?モバイルSafariの埋め込みコンテンツをスクロールするには、複数の指を使用する必要がある場合があるので、「ドラッグ可能な」コンテンツの場合も同じです。
Walter Mundt

ウォルター・ムント、ありがとう!指のバリエーションは試したことがないので、手にしたら試してみます!
artlung 2010年

1
2本または3本の指で実際に「ページ全体」が誤ってスクロールするのを防ぎましたが、ドラッグ可能なものには変更を加えませんでした。
artlung

このテクニックは残念ながら私にはうまくいかなかったようです。:(
ブラスター

@blaster他の可能な解決策については、他の回答のいくつかを見る必要があります
artlung

回答:


138

何時間も無駄にした後、これに出くわしました!

jquery-ui-touch-punch

タップイベントをクリックイベントに変換します。jqueryの後にスクリプトをロードすることを忘れないでください。

私はこれをiPadとiPhoneで動作させました

$('#movable').draggable({containment: "parent"});

2
この解決策はうまく機能し、私が疲れた別の答えはバグがあり、本当に
役に立た

小さなヒント:うまく機能しますが、ドラッグ可能な要素がその上のマスクのある画像のようなレイヤーで覆われている場合、ドラッグはアクティブ化されませんが、ソリューションはadd pointer-events:noneになります。上の層に。
Adler

これは素晴らしくてシンプルなソリューションです。プラグインを使用して、JQueryのドラッグ可能な関数を使い続けます。パーフェクト、ありがとう!
ほぼ初心者の

これにより、ドラッグ可能なアイテム内のクリック可能なアイテムが防止されます。
Abdul Sadik Yalcin

61

注意:この回答は2010年に書かれたもので、テクノロジーは急速に変化しています。より最近の解決策については、以下の@ ctrl-alt-dileepの回答を参照してください


必要に応じて、jQuery touchプラグインを試すこともできますここで例を試すことができます。iPhoneでドラッグしても問題なく動作しますが、jQuery UI Draggableでは動作しません。

または、このプラグインを試すこともできますが、実際には独自のドラッグ可能な関数を作成する必要があります。

余談ですが、信じられないかもしれませんが、iPadやiPhoneなどのタッチデバイスが:hover / onmouseover関数を使用するWebサイトとドラッグ可能なコンテンツの両方で問題を引き起こしているという噂が高まっています。

この基盤となるソリューションに興味がある場合は、3つの新しいJavaScriptイベントを使用します。ontouchstart、ontouchmove、ontouchend。アップルは実際にそれらの使用についての記事を書いており、ここで見つけることができます。簡単な例はここにあります。これらのイベントは、私がリンクした両方のプラグインで使用されています。


2
超イケてる!私がしなければならなかったすべては.touch({ animate: false, sticky: false, dragx: true, dragy: true, rotate: false, resort: true, scale: false });私の既存のdraggable()呼び出しにつなぐことであり、それは御馳走を働かせました!ワークフローを正しくするために、処理したいすべてのイベントを解決する必要がありますが、jQuery touchプラグインでうまくいきました!
artlung

4
プラグインは、jquery.comで利用できなくなったようです。あなたはまだここでjavascriptを見つけることができますmanifestinteractive.com/iphone/touch/js/jquery.touch.js
bjelli '17年

1
えっと、このプラグインはmanifestinteractive.comにもありません。これを試してください: plugins.jquery.com/files/jquery.touch.js.txt
Ian Hunter

5
この回答は無効になりました。2012年の回答については、以下の@ ctrl-alt-dileepの回答(jquery-ui-touch-punch)を参照してください
bjelli

1
@bjelliこれを指摘してくれてありがとう。回答を警告付きで更新しました。:)
フォンコンラッド


7

jQuery ui 1.9がこれを処理します。プレのデモはこちらです。

https://dl.dropbox.com/u/3872624/lab/touch/index.html

jquery.mouse.ui.jsを取り出して、ロードしているjQuery uiファイルの下に貼り付ければ、あとはこれで完了です。並べ替えも可能です。

このコードは私にとってはうまく機能していますが、エラーが発生した場合は、jquery.mouse.ui.jsの更新されたバージョンがここにあります。

jquery-ui sortableは、AndroidまたはIOSベースのタッチデバイスでは機能しません


3
これは、彼らがこの1.9を扱っているのは素晴らしいことです。FWIW、私はそのデモのコードのバージョンにバグがあることを発見し、うまく機能しませんでした。誰かがこの質問にもっと正しいバージョンを投稿しました:stackoverflow.com/questions/6745098/…それは私にとってよりうまくいきます。
asgeo1 2011

これに対処するために回答を更新しました。オリジナルの使用例ではまだエラーが発生していません。
thatmiddleway

1
Dropboxリンクがダウンしています。
BerggreenDK 2013年


2

私は昨日、同様の問題に苦しんでいました。他の回答で言及されているjQueryタッチパンチと一緒にドラッグ可能なjQuery UIを使用する「実用的な」ソリューションはすでにありました。ただし、このメソッドを使用すると、一部のAndroidデバイスで奇妙なバグが発生するため、偽のマウスイベントをエミュレートするメソッドを使用する代わりに、タッチイベントを使用してHTML要素をドラッグ可能にする小さなjQueryプラグインを作成することにしました。

この結果は、要素をドラッグ可能にするための単純なjQueryプラグインであるjQuery Draggable Touchです。これは、タッチイベント(touchstart、touchmove、touchendなど)を使用して、主要なターゲットとしてタッチデバイスを備えています。ブラウザ/デバイスがタッチイベントをサポートしていない場合は、マウスイベントを使用するフォールバックがまだあります。


こんにちはヘイマン、それはいい仕事です。共有していただきありがとうございます。サイズ変更可能なjQueryでも機能しますか?
ハリス

1

jquery.pep.jsを使用してみてください

jquery.pep.jsは、任意のDOM要素をドラッグ可能なオブジェクトに変換する軽量のjQueryプラグインです。タッチからクリックまで、古いものから新しいものまで、ほとんどすべてのブラウザーで機能します。jQuery UIのドラッグ可能なUIがタッチデバイスでは機能しなかった(ハッカーを使用しなかった)ため、jQuery UIのドラッグ可能機能が満たされないというニーズに応えるために作成しました。

ウェブサイトGitHubリンク


1
@martynasに感謝します、私はそれをチェックします!
artlung 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.