2010-06-11 13 views
104

Tengo una jQuery UI draggable() que funciona en Firefox y Chrome. El concepto de interfaz de usuario es, básicamente, hacer clic para crear un elemento de tipo "post-it".¿Cómo puedo hacer que una interfaz de usuario jQuery 'arrasgable()' div se pueda arrastrar para pantalla táctil?

Básicamente, hago clic o toco en div#everything (100% de alto y ancho) que escucha los clics y aparece un área de texto de entrada. Agrega texto y luego, cuando termina, lo guarda. Puede arrastrar este elemento alrededor. Eso está funcionando en navegadores normales, pero en un iPad puedo probar con No puedo arrastrar los artículos. Si toco para seleccionar (se atenúa levemente), no puedo arrastrarlo. No arrastrará a la izquierda ni a la derecha en absoluto. I puede arrastrar hacia arriba o hacia abajo, pero no estoy arrastrando el individuo div, estoy arrastrando toda la página web.

Así que aquí está el código que utilizo para capturar clics:

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

Y aquí está el código que utilizo para "salvar" a la nota y gire el div de entrada en sólo un div pantalla:

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

Y tengo este código cuando me carga la página de notas guardadas:

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

Mi mano STATE objeto les ahorrando las notas.

OnLoad, esto es todo el cuerpo 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> 

Por lo tanto, mi pregunta es en realidad: ¿cómo puedo hacer este trabajo mejor en el iPad?

No estoy configurado en la interfaz de usuario de jQuery, me pregunto si esto es algo que estoy haciendo mal con jQuery UI, o jQuery, o si puede haber mejores marcos para hacer compatible con plataforma cruzada/retrocompatible () elementos que funcionarán para las IU con pantalla táctil.

También serían bienvenidos comentarios más generales sobre cómo escribir componentes de IU como este.

Gracias!


ACTUALIZACIÓN: pude simplemente encadenar esta en mi jQuery UI draggable() llamada y obtener la correcta draggability en IPAD!

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

El jQuery Touch plugin hizo el truco!

+1

Tengo curiosidad acerca de algo: se puede arrastrar el div en torno con dos o tres dedos? Sé que a veces tiene que usar varios dedos para desplazarse por el contenido incrustado en Safari móvil, por lo que puede ser el mismo para el contenido "arrastrable". –

+0

Walter Mundt gracias! No he probado ninguna variación de dedos, lo intentaré cuando lo tenga en mis manos. – artlung

+1

dos o tres dedos en realidad impidieron que la "página completa" se desplazara inadvertidamente, pero no hizo ningún cambio para el arrastrable. – artlung

Respuesta

130

Después de pasar muchas horas, llegué a través de esto!

jquery-ui-touch-punch

se traduce eventos de derivación como eventos de clic. Recuerde cargar el script después de jquery.

Tengo esta trabajando en el iPad y el iPhone

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

Esta solución funciona muy bien, otra respuesta que me cansé fue con errores y realmente no me ayudó – musefan

+1

@ ctrl-alt-dileep Gracias también me ayuda .. – Kamarshad

+2

¡Funciona en Nexus 7, gracias! –

59

Precaución: Esta respuesta se escribió en 2010 y la tecnología avanza rápidamente. Para una solución más reciente, vea @ctrl-alt-dileep's answer below.


Dependiendo de sus necesidades, es posible que desee probar el jQuery touch plugin; puedes probar un ejemplo here. Funciona bien para arrastrar en mi iPhone, mientras que jQuery UI Draggable no funciona.

Alternativamente, puedes probar el complemento this, aunque eso puede requerir que realmente escribas tu propia función que se puede arrastrar.

Como nota al margen: Lo creas o no, estamos escuchando cada vez más rumores acerca de cómo los dispositivos táctiles como el iPad y el iPhone están causando problemas tanto para sitios web que utilizan: funciones hover/onmouseover y contenido arrastrable.

Si está interesado en la solución subyacente para esto, es utilizar tres nuevos eventos de JavaScript; ontouchstart, ontouchmove y ontouchend. Apple en realidad ha escrito un artículo sobre su uso, que puede encontrar en here. Se puede encontrar un ejemplo simplificado here. Estos eventos se usan en los dos complementos a los que me he vinculado.

Espero que esto ayude!

+2

¡Genial! Todo lo que tenía que hacer era encadenar en '.Toque ({ \t \t \t \t animado: false, \t \t \t \t pegajoso: false, \t \t \t \t dragx: true, \t \t \t \t Dragy: true, \t \t \t \t rotación: falso, \t \t \t \t localidad: verdad, \t \t \t \t escala: falsa \t \t \t}); 'a mi ya existente' arrastrable() ' llame y funciona un placer! Todavía tengo que resolver todos los eventos con los que quiero lidiar para obtener el flujo de trabajo correcto, ¡pero el plugin de jQuery touch hizo el truco! – artlung

+0

Excelente primer uso del sistema de recompensas. ¡Gracias! También buscaré otras formas de hacer esto. Sin embargo, esperamos que los chicos de jQueryUI puedan integrar el soporte de la pantalla táctil. Parece una adición obvia. – artlung

+0

Sí, estoy totalmente de acuerdo en que la compatibilidad con pantalla táctil sería una buena adición a jQuery UI. ¡Me alegra ser de ayuda! – vonconrad

24

Este proyecto debería ser útil: asigna eventos táctiles para hacer clic en eventos de manera que permite a jQuery UI trabajar en iPad y iPhone sin ningún cambio. Simplemente agregue el JS a cualquier proyecto existente.

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

+0

Gracias por la pista, ese plugin es increíble –

+0

¡Muchas gracias! – epaps

+0

https://github.com/furf/jquery-ui-touch-punch este proyecto podría ayudar –

7

jQuery UI 1.9 va a hacerse cargo de esto para usted. Aquí está una demostración de la pre:

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

sólo agarrar los jquery.mouse.ui.js a cabo, se adhieren bajo el archivo de interfaz de usuario jQuery va a cargar, y eso es todo lo que tiene que hacer! Funciona para ordenar también.

Este código está trabajando muy bien para mí, pero si sus errores que consiguen, una versión actualizada de jquery.mouse.ui.js se puede encontrar aquí:

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

+3

Esto es genial, están lidiando con este 1.9. FWIW, encontré que la versión del código en esa demostración tenía errores y no funcionó tan bien. Alguien publicó una versión más correcta de esta pregunta: http://stackoverflow.com/questions/6745098/jquery-ui-sortable-doesnt-work-on-touch-devices-based-on-android-or-ios que está funcionando mejor para mi. – asgeo1

+0

Actualicé mi respuesta para abordar esto. Todavía no he recibido ningún error en mi caso de uso con el original. – thatmiddleway

+1

El enlace de Dropbox está abajo. – BerggreenDK

2

yo estaba luchando con un problema similar ayer. Ya tenía una solución de "trabajo" que utilizaba el arrastrable de jQuery UI junto con jQuery Touch Punch, que se mencionan en otras respuestas. Sin embargo, usar este método causaba errores extraños en algunos dispositivos Android, por lo que decidí escribir un pequeño complemento jQuery que puede hacer que los elementos HTML sean arrastrables mediante el uso de eventos táctiles en lugar de utilizar un método que simule eventos falsos del mouse.

El resultado de esto es jQuery Draggable Touch que es un plugin jQuery simple para hacer que los elementos sean arrastrables, que tiene dispositivos táctiles como su objetivo principal mediante el uso de eventos táctiles (como touchstart, touchmove, touchend, etc.). Todavía tiene una alternativa que usa eventos de mouse si el navegador/dispositivo no admite eventos táctiles.

+0

Hola Heyman, ese es un buen trabajo. Gracias por compartirlo. ¿Funcionará para que jQuery se pueda cambiar también? – Haris

1

Puede probar el uso de jquery.pep.js:

jquery.pep.js es un plugin de jQuery ligero que convierte cualquier elemento DOM en un objeto arrastrable. Funciona principalmente en todos los navegadores, de antiguo a nuevo, desde el tacto hasta el clic. Lo construí para servir una necesidad en que jQuery UI no podía arrastrar, ya que no funcionaba en dispositivos táctiles (sin algunos hackers).

Website, GitHub link

+1

¡Gracias @martynas, lo comprobaré! – artlung

Cuestiones relacionadas