Dokunmatik ekran için bir jQuery kullanıcı arayüzünü 'sürüklenebilir ()' div'i sürüklenebilir hale nasıl getirebilirim?


112

draggable()Firefox ve Chrome'da çalışan bir jQuery kullanıcı arayüzüne sahibim . Kullanıcı arabirimi kavramı temelde "post-it" tipi bir öğe oluşturmak için tıklamaktır.

Temel olarak, div#everythingtıklamaları dinleyen (% 100 yüksek ve geniş) üzerine tıklıyorum veya dokunuyorum ve bir giriş metin alanı görüntüleniyor. Metin eklersiniz ve işiniz bittiğinde onu kaydeder. Bu öğeyi sürükleyebilirsiniz. Bu normal tarayıcılarda çalışıyor, ancak bir iPad'de test edebilirim, öğeleri sürükleyemiyorum. Seçmek için dokunursam (sonra hafifçe kararır), sonra sürükleyemem. Sola veya sağa hiç sürüklenmez. Ben yapabilirsiniz yukarı veya aşağı sürükle, ama bireysel sürükleyerek değilim divben bütün web sayfasını sürükleyerek ediyorum.

İşte tıklamaları yakalamak için kullandığım kod:

$('#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);
});

Ve notu "kaydetmek" ve giriş divini yalnızca bir display div'e dönüştürmek için kullandığım kod:

$('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();
    }
});

Kaydedilen notlar için sayfayı yüklediğimde bu koda sahip oluyorum:

$('.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();
    }
});

Benim STATEnotları kaydetme nesne kolları.

Onload, bu tüm html gövdesidir:

<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>

Öyleyse, sorum şu: Bunun iPad'de daha iyi çalışmasını nasıl sağlayabilirim?

JQuery kullanıcı arayüzüne ayarlı değilim, bunun jQuery UI veya jQuery ile yanlış yaptığım bir şey olup olmadığını veya çapraz platform / geriye dönük uyumlu sürüklenebilir () öğeleri yapmak için daha iyi çerçeveler olup olmadığını merak ediyorum. dokunmatik ekran kullanıcı arayüzleri için çalışır.

Bunun gibi UI bileşenlerinin nasıl yazılacağı hakkında daha genel yorumlar da memnuniyetle karşılanacaktır.

Teşekkürler!


GÜNCELLEME: Bunu jQuery UI draggable()çağrıma bağlayabildim ve iPad'de doğru sürüklenebilirliği elde ettim!

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

JQuery Dokunmatik eklentisi işe yaradı!


1
Bir şeyi merak ediyorum: div'i iki veya üç parmağınızla sürükleyebilir misiniz? Mobil Safari'de gömülü içeriği kaydırmak için bazen birden fazla parmak kullanmanız gerektiğini biliyorum, bu nedenle "sürüklenebilir" içerik için aynı şey olabilir.
Walter Mundt

Walter Mundt teşekkürler! Herhangi bir parmak varyasyonunu denemedim, elime aldığımda deneyeceğim!
artlung

1
iki veya üç parmak aslında "tüm sayfanın" yanlışlıkla kaydırılmasını engelledi, ancak sürüklenebilir için hiçbir değişiklik yapmadı.
artlung

Bu teknik maalesef bende işe yaramadı. :(
blaster

@blaster Diğer olası çözümler için diğer yanıtlardan bazılarına bakmanız gerekecek
artlung

Yanıtlar:


138

Saatlerce boşa harcadıktan sonra bununla karşılaştım!

jquery-ui-dokunmatik yumruk

Dokunma olaylarını tıklama olayları olarak çevirir. Komut dosyasını jquery'den sonra yüklemeyi unutmayın.

Bunu iPad ve iPhone'da çalıştırdım

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

2
Bu çözüm harika çalışıyor, yorulduğum bir başka cevap ise buggy ve gerçekten yardımcı olmadı
musefan

Küçük bir ipucu: harika çalışıyor, ancak üzerinde maske olan bir görüntü gibi katmanlarla kaplı sürüklenebilir öğe etkinleştirilmez, ancak çözüm işaretçi olayları ekleme: yok; üst katmanlarda.
Adler

Bu harika ve basit bir çözüm, sadece eklentiyi kullanın ve JQuery sürüklenebilir işlevi ile çalışmaya devam edin. Mükemmel teşekkürler!
Neredeyse bir acemi

Bu, sürüklenebilir içindeki tıklanabilir öğeleri önleyecektir.
Abdul Sadık Yalçın

61

Dikkat: Bu cevap 2010'da yazılmıştır ve teknoloji hızlı hareket etmektedir. Daha yeni bir çözüm için aşağıdaki @ ctrl-alt-dileep'in cevabına bakın .


İhtiyaçlarınıza bağlı olarak jQuery touch eklentisini denemek isteyebilirsiniz ; burada bir örnek deneyebilirsiniz . İPhone'umda sürüklemek iyi çalışıyor, oysa jQuery UI Draggable çalışmıyor.

Alternatif olarak, bu eklentiyi deneyebilirsiniz , ancak bu aslında kendi sürüklenebilir işlevinizi yazmanızı gerektirebilir.

Bir yan not olarak: İster inanın ister inanmayın, iPad ve iPhone gibi dokunmatik cihazların hem web sitelerinde gezinme / fareyle üzerine gelme işlevlerini hem de sürüklenebilir içeriği kullanan web sitelerinde nasıl sorunlara yol açtığına dair artan söylentiler duyuyoruz.

Bunun temelindeki çözümle ilgileniyorsanız, üç yeni JavaScript etkinliği kullanmaktır; ontouchstart, ontouchmove ve ontouchend. Apple aslında kullanımları hakkında burada bulabileceğiniz bir makale yazmıştır . Basitleştirilmiş bir örnek burada bulunabilir . Bu olaylar, bağlandığım her iki eklentide de kullanılıyor.


2
Süper harika! Tek yapmam gereken .touch({ animate: false, sticky: false, dragx: true, dragy: true, rotate: false, resort: true, scale: false });mevcut draggable()çağrıma zincirlemekti ve bu bir zevk! İş akışını doğru bir şekilde yapmak için uğraşmak istediğim tüm olayları halletmem gerekiyor, ancak jQuery touch eklentisi hile yaptı!
artlung

4
eklenti artık jquery.com'da görünmüyor. javascript'i burada hala bulabilirsiniz manifestinteractive.com/iphone/touch/js/jquery.touch.js
bjelli

1
Heh, şimdi eklenti manifestinteractive.com'da da yok. Şunu
Ian Hunter

5
bu cevap artık geçerli değil. 2012 cevabı için aşağıdaki @ ctrl-alt-dileep'in cevabına bakın (jquery-ui-touch-punch)
bjelli

1
@bjelli Bunu işaret ettiğiniz için teşekkürler. Cevabımı bir uyarı ile güncelledim. :)
vonconrad


7

jQuery ui 1.9 sizin için bununla ilgilenecek. İşte ön bir demo:

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

Sadece jquery.mouse.ui.js dosyasını çıkarın, yüklediğiniz jQuery ui dosyasının altına yapıştırın ve yapmanız gereken tek şey bu! Sıralanabilir için de çalışıyor.

Bu kod benim için harika çalışıyor, ancak hata alırsanız, jquery.mouse.ui.js'nin güncellenmiş bir sürümünü burada bulabilirsiniz:

Jquery-ui sortable, Android veya IOS tabanlı dokunmatik cihazlarda çalışmıyor


3
Bu 1.9 ile uğraşmaları harika. FWIW, o demodaki kod sürümünün içinde hatalar olduğunu ve o kadar da iyi çalışmadığını buldum. Birisi bu soru hakkında daha doğru bir sürüm yayınladı: benim için daha iyi çalışan stackoverflow.com/questions/6745098/… .
asgeo1

Cevabımı bunu ele almak için güncelledim. Kullanım durumumda orijinaliyle henüz herhangi bir hata almadım.
thatmiddleway

1
Dropbox bağlantısı çalışmıyor.
BerggreenDK


2

Dün benzer bir sorunla boğuşuyordum. JQuery kullanıcı arayüzünün sürüklenebilirliğini jQuery Touch Punch ile birlikte kullanan bir "çalışan" çözümüm zaten vardı, diğer cevaplarda da bahsedilmişti. Ancak, bu yöntemi kullanmak benim için bazı Android cihazlarda garip hatalara neden oluyordu ve bu nedenle, sahte fare olaylarını taklit eden bir yöntem kullanmak yerine dokunma olaylarını kullanarak HTML öğelerini sürüklenebilir hale getirebilen küçük bir jQuery eklentisi yazmaya karar verdim.

Bunun sonucu, öğeleri sürüklenebilir hale getirmek için basit bir jQuery eklentisi olan jQuery Draggable Touch'tır, dokunma olaylarını (touchstart, touchmove, touchend, vb.) Kullanarak ana hedef olarak dokunmatik cihazlara sahiptir. Tarayıcı / cihaz dokunma olaylarını desteklemiyorsa, yine de fare olaylarını kullanan bir yedeği vardır.


Merhaba Heyman, Bu iyi iş. Paylaştığınız için teşekkürler Yeniden boyutlandırılabilir jQuery için de çalışacak mı?
Haris

1

Jquery.pep.js kullanmayı deneyebilirsiniz :

jquery.pep.js , herhangi bir DOM öğesini sürüklenebilir bir nesneye dönüştüren hafif bir jQuery eklentisidir. Eskiden yeniye, dokunmadan tıklamaya çoğunlukla tüm tarayıcılarda çalışır. Dokunmatik cihazlarda (bazı bilgisayar korsanlığı olmadan) çalışmadığı için jQuery UI's draggable'ın karşılanmadığı bir ihtiyaca hizmet etmek için inşa ettim.

Web sitesi , GitHub bağlantısı


1
Teşekkürler @martynas, kontrol edeceğim!
artlung
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.