2010-06-11 12 views
104

Ho un'interfaccia utente jQuery draggable() che funziona in Firefox e Chrome. Il concetto di interfaccia utente è fondamentalmente un clic per creare un elemento di tipo "post-it".Come si può rendere draggable un jaggery draggable() di jQuery per il touchscreen?

Fondamentalmente, faccio clic o tocco su div#everything (100% di altezza e larghezza) che ascolta i clic e viene visualizzata un'area di testo di input. Aggiungi del testo e poi quando hai finito lo salva. Puoi trascinare questo elemento. Funziona con i normali browser, ma su un iPad posso testare con I non è possibile trascinare gli oggetti. Se tocco per selezionare (quindi si attenua leggermente), non posso quindi trascinarlo. Non trascinerà verso sinistra o verso destra. I può trascinare verso l'alto o verso il basso, ma non sto trascinando l'individuo div, sto trascinando l'intera pagina web.

Quindi, ecco il codice che uso per acquisire i clic:

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

Ed ecco il codice che uso per "salvare" la nota e girare la div input in solo un div visualizzazione:

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

E ho questo codice quando si carica la pagina per le note salvate:

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

mia mano STATE oggetto salvando le note.

Onload, questo è l'intero corpo 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> 

Così, la mia domanda è in realtà: come posso fare questo lavoro meglio su iPad?

Non sono impostato sull'interfaccia utente di jQuery, mi chiedo se questo è qualcosa che sto sbagliando con l'interfaccia utente di jQuery, o jQuery, o se potrebbero esserci strutture migliori per eseguire il trascinamento multipiattaforma/retrocompatibile () elementi che funzioneranno per le interfacce utente touchscreen.

Altri commenti generali su come scrivere componenti UI come questo sarebbero benvenuti.

Grazie!


UPDATE: ero in grado di concatenare semplicemente questo sul mio jQuery UI draggable() chiamata e ottenere la corretta draggability su iPad!

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

Il jQuery Touch plugin ha fatto il trucco!

+1

Sono curioso di sapere qualcosa: si può trascinare il div in giro con due o tre dita? So che a volte devi utilizzare più dita per scorrere i contenuti incorporati in Safari mobile, quindi potrebbe essere lo stesso per i contenuti "trascinabili". –

+0

Walter Mundt, grazie! Non ho provato nessuna variazione delle dita, proverò quando ce l'ho tra le mani! – artlung

+1

in realtà due o tre dita impedivano effettivamente che la "pagina intera" scorresse inavvertitamente, ma non ha apportato modifiche per il trascinamento. – artlung

risposta

130

Dopo sprecare molte ore, sono venuto attraverso questo!

jquery-ui-touch-punch

Traduce eventi rubinetto come eventi click. Ricordarsi di caricare lo script dopo jquery.

ho ottenuto questo lavorando su iPad e iPhone

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

Questa soluzione funziona alla grande, un'altra risposta che ero stanco era bacato e non mi ha davvero aiutato – musefan

+1

@ ctrl-alt-dileep grazie anche a me mi aiuta .. – Kamarshad

+2

Funziona su Nexus 7, grazie! –

59

Attenzione: Questa risposta è stata scritta nel 2010 e la tecnologia si muove rapidamente. Per una soluzione più recente, vedere @ctrl-alt-dileep's answer below.


A seconda delle esigenze, è possibile provare il jQuery touch plugin; puoi provare un esempio here. Funziona benissimo per trascinare sul mio iPhone, mentre jQuery UI Draggable no.

In alternativa, è possibile provare il plug-in this, anche se ciò potrebbe richiedere la scrittura della propria funzione trascinabile.

Come nota a margine: ci crediate o no, stiamo sentendo un crescente ronzio su come dispositivi touch come iPad e iPhone stiano causando problemi sia per i siti Web che utilizzano: funzioni hover/onmouseover e contenuti trascinabili.

Se si è interessati alla soluzione sottostante, è necessario utilizzare tre nuovi eventi JavaScript; onuchstart, onuchmove e onuchend. Apple ha effettivamente scritto un articolo sul loro utilizzo, che è possibile trovare here. Un esempio semplificato può essere trovato here. Questi eventi sono utilizzati in entrambi i plugin a cui mi sono collegato.

Spero che questo aiuti!

+2

Super fantastico! Tutto quello che dovevo fare era quello di catena su '.touch ({ \t \t \t \t animato: false, \t \t \t \t appiccicoso: false, \t \t \t \t dragx: vero, \t \t \t \t Dragy: vero, \t \t \t \t rotazione: false, \t \t \t \t resort: vero, \t \t \t \t scala: true \t \t \t}); 'al mio attuale' trascinabili() ' chiama e funziona a meraviglia! Devo ancora elaborare tutti gli eventi che voglio gestire per ottenere il flusso di lavoro giusto, ma il plugin touch di jQuery ha fatto il trucco! – artlung

+0

Eccellente primo utilizzo del sistema di taglie. Grazie! Vedrò anche altri modi per farlo. Sperando che i ragazzi di jQueryUI possano integrare il supporto touchscreen. Sembra un'aggiunta ovvia. – artlung

+0

Sì, sono pienamente d'accordo sul fatto che il supporto al touchscreen sarebbe una buona aggiunta all'interfaccia utente di jQuery. Felice di essere di aiuto! – vonconrad

24

Questo progetto dovrebbe essere utile: le mappe toccano gli eventi per fare clic sugli eventi in modo che l'interfaccia utente di jQuery funzioni su iPad e iPhone senza alcuna modifica. Basta aggiungere il JS a qualsiasi progetto esistente.

http://code.google.com/p/jquery-ui-for-ipad-and-iphone/

+0

thx per il suggerimento, quel plugin è fantastico –

+0

Grazie mille! – epaps

+0

https://github.com/furf/jquery-ui-touch-punch questo progetto potrebbe essere d'aiuto –

7

jQuery UI 1.9 sta andando a prendersi cura di questo per voi. Heres una demo del pre:

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

Basta prendere le jquery.mouse.ui.js fuori, bastone sotto il file ui di jQuery si sta caricando, e questo è tutto si dovrebbe avere a che fare! Funziona anche per ordinabile.

Questo codice funziona grande per me, ma se i vostri errori di ottenere, una versione aggiornata del jquery.mouse.ui.js può essere trovato qui:

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

+3

Questo è fantastico, hanno a che fare con questo 1.9. FWIW, ho trovato che la versione del codice in quella demo conteneva bug e non funzionava molto bene. Qualcuno ha pubblicato una versione più corretta su questa domanda: http://stackoverflow.com/questions/6745098/jquery-ui-sortable-doesnt-work-on-touch-devices-based-on-android-or-ios che funziona meglio per me. – asgeo1

+0

Ho aggiornato la mia risposta per risolvere questo problema. Non ho ancora riscontrato alcun errore nel mio caso d'uso con l'originale. – thatmiddleway

+1

Il link Dropbox è inattivo. – BerggreenDK

2

ero alle prese con un problema simile ieri. Ho già avuto una soluzione "funzionante" usando l'interfaccia utente di jQuery trascinata insieme a jQuery Touch Punch, che sono menzionate in altre risposte. Tuttavia, l'utilizzo di questo metodo causava per me strani bug in alcuni dispositivi Android e quindi ho deciso di scrivere un piccolo plug-in jQuery che può rendere trascinabili gli elementi HTML utilizzando gli eventi tattili anziché utilizzare un metodo che emula gli eventi del mouse falso.

Il risultato è jQuery Draggable Touch che è un semplice plug-in jQuery per rendere trascinabili gli elementi, che dispone di dispositivi touch come obiettivo principale utilizzando gli eventi touch (come touchstart, touchmove, touchend, ecc.). Ha ancora un fallback che utilizza gli eventi del mouse se il browser/dispositivo non supporta gli eventi touch.

+0

Ciao Heyman, Bel lavoro. Grazie per averlo condiviso. Funzionerà anche per ridimensionare jQuery? – Haris

1

Puoi provare a utilizzare jquery.pep.js:

jquery.pep.js è un plugin jQuery leggero che trasforma qualsiasi elemento DOM in un oggetto trascinabile. Funziona su quasi tutti i browser, dal vecchio al nuovo, dal tocco al clic. L'ho compilato per rispondere a un'esigenza in che il trascinamento di UI di jQuery non era soddisfacente, dal momento che non funzionava con lo su dispositivi touch (senza alcuno hackery).

Website, GitHub link

+1

Grazie @martynas, lo controllerò! – artlung

Problemi correlati