Arrastrar y soltar HTML en dispositivos móviles

89

Cuando agrega arrastrar y soltar a una página web usando JavaScript, como jQuery UI que se puede arrastrar y soltar, ¿cómo puede hacer que esto funcione cuando se ve a través de un navegador en un dispositivo móvil, donde las acciones de la pantalla táctil para arrastrar son interceptadas por el teléfono para desplazarse por la página, etc.

Todas las soluciones son bienvenidas ... mis pensamientos iniciales son:

  1. Tenga un botón para dispositivos móviles que "levante" el elemento que se va a arrastrar y luego haga que hagan clic en la zona en la que quieren soltar el elemento.

  2. Escriba una aplicación que haga esto para dispositivos móviles en lugar de intentar que la página web funcione en ellos.

  3. Sus sugerencias y comentarios por favor.

Fenton
fuente
¿A qué dispositivos se dirige?
Marko
22
@Marko - todos ellos. No es la Web si excluyo a alguien.
Fenton
Si no quiere jQuery en absoluto, eche un vistazo a este github.com/capriza/mobile-touch
oriharel

Respuestas:

101

jQuery UI Touch Punch simplemente lo resuelve todo.

Es un soporte de evento táctil para jQuery UI. Básicamente, solo conecta el evento táctil a la interfaz de usuario de jQuery. Probado en iPad, iPhone, Android y otros dispositivos móviles táctiles. Usé jQuery UI ordenable y funciona como un encanto.

http://touchpunch.furf.com/

vichsu
fuente
4
No funciona en el navegador estándar de Android 4.0. Sin embargo, funciona en Chrome móvil.
Timmmm
¿Tenemos primero una pulsación larga antes de arrastrar? porque cuando usamos el ancho completo en el elemento que se puede arrastrar, entonces queremos desplazarnos hacia la parte inferior, automáticamente arrastra el elemento
CaffeineShots
1
asegúrese de que ésta sea la última <script> declaración en la cabecera de su archivo html, especialmente jquery-ui, o no va a funcionar
whyoz
@vichsu Muchas gracias por esta respuesta, que simplemente resolvió perfectamente mi problema.
Brady Zhu
realmente no funciona en Android 4.0 .. o hay alguna solución?
rashidnk
23

Hay un nuevo polyfill para traducir eventos táctiles para arrastrar y soltar, de modo que HTML5 Drag And Drop se puede utilizar en dispositivos móviles.

El polyfill fue introducido por Bernardo Castilho en esta publicación .

Aquí hay una demostración de esa publicación.

La publicación también presenta varias consideraciones del diseño de folyfill.

remdevtec
fuente
7

La versión beta de Sencha Touch tiene soporte para arrastrar y soltar.

Puede consultar su ejemplo de DnD . Por cierto, esto solo funciona en navegadores webkit.

Actualizar esa lógica en una página web probablemente será difícil. Según tengo entendido, deshabilitan todos los panoramas del navegador e implementan eventos de panoramización completamente en javascript, lo que permite una interpretación correcta de arrastrar y soltar.

Actualización: el enlace de ejemplo original está muerto, pero encontré esta alternativa:
https://github.com/kostysh/Drag-Drop-example-for-Sencha-Touch

Joeri Sebrechts
fuente
Esto es muy interesante, así que lo descargaré y lo jugaré: probado en Android y en su mayoría funciona, así que solo necesito ver los detalles, ¡gracias!
Fenton
6
De acuerdo, probablemente no usaré esa biblioteca en particular (con más de 200k cuando se minifica), pero puedo usar los conceptos que contiene para obtener el tipo de idea. La idea general es que haces que tu página no se pueda interpretar como más grande que el tamaño de la pantalla, lo que engaña al navegador móvil para que no intercepte los deslizamientos / arrastres.
Fenton
1
Sohnee, estamos agregando un constructor para Touch 1.0 que elimina las partes no utilizadas de la biblioteca, esto reducirá sustancialmente la huella. Además, comprimido con gzip, la biblioteca completa es 50-80k.
Michael Mullany
7

Necesitaba crear una rotación de arrastrar y soltar + que funciona en computadoras de escritorio, dispositivos móviles, tabletas, incluido Windows Phone. El último lo hizo más complicado (eventos mspointer vs. touch).

La solución vino de la gran biblioteca Greensock

Se necesitaron algunos saltos a través de aros para hacer que el mismo objeto se pueda arrastrar y girar, pero funciona perfectamente

Tomer Almog
fuente
¿Tipo de licencia? ¿Gratis? Revisé el sitio, pero parece que están vendiendo la biblioteca.
ShanerM13
Han pasado 6 años desde que respondí esto. No estoy seguro de si cambiaron su tipo de licencia. Solía ​​ser gratis en 2014 ...
Tomer Almog
IDK cómo pasé por alto esto, pero greensock.com/licensing
ShanerM13
Básicamente, es gratis siempre que su producto sea gratuito (con la excepción de que permiten cargos únicos), de lo contrario, debe obtener una licencia comercial con ellos.
ShanerM13
3

También podría probar el polyfill de arrastrar y soltar de Tim Ruffle , ciertamente similar a Bernardo Castilho (ver la respuesta de @remdevtec).

Simplemente haz npm install mobile-drag-drop --save (otros métodos de instalación disponibles, por ejemplo, con bower)

Entonces, cualquier interfaz de elemento que dependa de la detección táctil debería funcionar en el móvil (por ejemplo, arrastrando solo un elemento, en lugar de desplazarse + arrastrar al mismo tiempo).

Frosty Z
fuente
1

Jquery Touch Punch es genial, pero lo que también hace es deshabilitar todos los controles en el div que se puede arrastrar, por lo que para evitar esto, debe alterar las líneas ... (en el momento de escribir este artículo, línea 75)

cambio

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

leer

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') {

agregue tantos ors como desee para cada uno de los elementos que desea 'desbloquear'

Espero que ayude a alguien

tedbaker
fuente
Definitivamente me ayudó, gracias. Estaba creando una lista de verificación ordenable y la casilla de verificación no hacía clic porque el div creado por touch-punch cubría la casilla de verificación. Esto lo resolvió y funcionó. gracias ....
Mikeys4u
1

aquí está mi solución:

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

La biblioteca Sortable JS es compatible con pantallas táctiles y no requiere jQuery.

La forma en que maneja las pantallas táctiles indica que debe tocar la pantalla durante aproximadamente 1 segundo para comenzar a arrastrar un elemento.

Además, presentan una prueba de video que muestra que esta biblioteca se ejecuta más rápido que JQuery UI Sortable.

Zoup
fuente