Trascina e rilascia HTML sui dispositivi mobili


89

Quando aggiungi il trascinamento della selezione a una pagina Web utilizzando JavaScript, ad esempio jQuery UI trascinabile e trascinabile, come puoi farlo funzionare quando viene visualizzato tramite un browser su un dispositivo mobile - dove le azioni del touchscreen per il trascinamento vengono intercettate dal telefono per scorrere la pagina, ecc?

Tutte le soluzioni sono benvenute ... i miei pensieri iniziali sono:

  1. Avere un pulsante per i dispositivi mobili che "solleva" l'elemento da trascinare e quindi fare clic sulla zona in cui desiderano rilasciare l'elemento.

  2. Scrivi un'app che lo faccia per i dispositivi mobili piuttosto che provare a far funzionare la pagina web su di essi!

  3. I vostri suggerimenti e commenti per favore.


Quali dispositivi stai prendendo di mira?
Marko

22
@Marko - tutti loro. Non è il Web se escludo qualcuno.
Fenton

Se non vuoi affatto jQuery, dai un'occhiata a questo github.com/capriza/mobile-touch
oriharel

Risposte:


101

jQuery UI Touch Punch risolve tutto.

È un supporto per eventi touch per l'interfaccia utente jQuery. Fondamentalmente, collega semplicemente l'evento touch all'interfaccia utente di jQuery. Testato su iPad, iPhone, Android e altri dispositivi mobili abilitati al tocco. Ho usato jQuery UI ordinabile e funziona come un fascino.

http://touchpunch.furf.com/


4
Non funziona sul browser Android 4.0 di serie. Tuttavia, funziona su Chrome mobile.
Timmmm

dobbiamo premere a lungo prima di trascinare? perché quando abbiamo usato l'intera larghezza nell'elemento che trascina in grado, allora vogliamo scorrere verso il basso trascina automaticamente l'elemento
CaffeineShots

1
assicurati di inserire questa tua ultima dichiarazione <script> nell'intestazione del tuo file html, specialmente jquery-ui, altrimenti non funzionerà
whyoz

@vichsu Grazie mille per questa risposta, che ha risolto perfettamente il mio problema.
Brady Zhu

davvero non funziona in Android 4.0 .. o c'è qualche soluzione?
rashidnk

23

C'è un nuovo polyfill per tradurre gli eventi di tocco in drag-and-drop, in modo tale che HTML5 Drag and Drop sia utilizzabile su dispositivi mobili.

Il polyfill è stato introdotto da Bernardo Castilho in questo post .

Ecco una demo di quel post.

Il post presenta anche diverse considerazioni sul design folyfill.


7

La versione beta di Sencha Touch supporta il trascinamento della selezione.

Puoi fare riferimento al loro esempio DnD . A proposito, funziona solo sui browser webkit.

Il retrofitting di questa logica in una pagina web sarà probabilmente difficile. A quanto ho capito, disabilitano tutti i panning del browser e implementano gli eventi di panning interamente in javascript, consentendo una corretta interpretazione del drag and drop.

Aggiornamento: il link dell'esempio originale è morto, ma ho trovato questa alternativa:
https://github.com/kostysh/Drag-Drop-example-for-Sencha-Touch


Questo è molto interessante, quindi lo scaricherò e proverò un gioco - testato su Android e funziona principalmente, quindi devo solo guardare i dettagli - grazie!
Fenton

6
Ok, probabilmente non userò quella libreria in particolare (che è più di 200k quando minimizzata), ma posso usare i concetti contenuti al suo interno per ottenere il tipo di idea. L'idea generale è che tu faccia in modo che la tua pagina non possa essere interpretata come più grande delle dimensioni dello schermo, il che induce il browser mobile a non intercettare i colpi / trascini!
Fenton

1
Sohnee, stiamo aggiungendo un builder per Touch 1.0 che rimuove le parti inutilizzate della libreria, questo ridurrà sostanzialmente l'ingombro. Inoltre, con gzip, la libreria completa è 50-80k.
Michael Mullany

7

Avevo bisogno di creare un drag and drop + rotazione che funzionasse su desktop, dispositivi mobili, tablet incluso Windows Phone. L'ultimo lo ha reso più complicato (mspointer vs. eventi touch).

La soluzione è arrivata dalla grande libreria Greensock

Ci sono voluti alcuni salti mortali per rendere lo stesso oggetto trascinabile e ruotabile, ma funziona perfettamente


Tipo di licenza? Gratuito? Ho controllato il sito, ma sembra che stiano vendendo la libreria.
ShanerM13

Sono passati 6 anni da quando ho risposto a questa domanda. Non sono sicuro che abbiano cambiato il tipo di licenza. Era gratuito nel 2014 ...
Tomer Almog,

IDK come ho trascurato questo, ma greensock.com/licensing
ShanerM13

Fondamentalmente, è gratuito a condizione che il tuo prodotto sia gratuito (con l'eccezione che consentono addebiti una tantum), altrimenti devi ottenere una licenza commerciale con loro.
ShanerM13

3

Potresti anche provare il polyfill drag-n-drop di Tim Ruffle , sicuramente simile a quello di Bernardo Castilho (vedi risposta @remdevtec).

Fallo semplicemente npm install mobile-drag-drop --save (altri metodi di installazione disponibili, ad es. Con pergola)

Quindi, qualsiasi interfaccia di elemento che si basa sul rilevamento del tocco dovrebbe funzionare su dispositivi mobili (ad esempio trascinando solo un elemento, invece di scorrere + trascinare contemporaneamente).


1

Jquery Touch Punch è fantastico, ma ciò che fa è disabilitare tutti i controlli sul div trascinabile, quindi per evitare ciò devi modificare le linee ... (al momento della scrittura - riga 75)

modificare

if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])){

leggere

if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0]) || event.originalEvent.target.localName === 'textarea'
        || event.originalEvent.target.localName === 'input' || event.originalEvent.target.localName === 'button' || event.originalEvent.target.localName === 'li'
        || event.originalEvent.target.localName === 'a'
        || event.originalEvent.target.localName === 'select' || event.originalEvent.target.localName === 'img') {

aggiungi tutti gli or che vuoi per ciascuno degli elementi che vuoi 'sbloccare'

Spero che aiuti qualcuno


Mi ha sicuramente aiutato, grazie. Stavo creando una lista di controllo ordinabile e la casella di spunta non faceva clic perché il div creato da touch-punch copriva la casella di controllo. Questo l'ha risolto e ha funzionato. grazie ....
Mikeys4u

1

ecco la mia soluzione:

$(el).on('touchstart', function(e) {
    var link = $(e.target.parentNode).closest('a')  
    if(link.length > 0) {
        window.location.href = link.attr('href');
    }
});

1

La libreria Sortable JS è compatibile con i touch screen e non richiede jQuery.

Il modo in cui gestisce i touchscreen richiede di toccare lo schermo per circa 1 secondo per iniziare a trascinare un elemento.

Inoltre, presentano un test video che mostra che questa libreria funziona più velocemente di JQuery UI Sortable.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.