Arrastar e soltar HTML em dispositivos móveis


89

Quando você adiciona arrastar e soltar em uma página da web usando JavaScript, como o jQuery UI arrastável e soltável, como você faz isso funcionar quando visualizado por meio de um navegador em um dispositivo móvel - onde as ações da tela de toque para arrastar são interceptadas pelo telefone para rolar a página, etc?

Todas as soluções são bem-vindas ... meus pensamentos iniciais são:

  1. Tenha um botão para dispositivos móveis que "levanta" o item a ser arrastado e, em seguida, faça com que eles cliquem na zona em que desejam soltar o item.

  2. Escreva um aplicativo que faça isso para dispositivos móveis em vez de tentar fazer com que a página da web funcione neles!

  3. Suas sugestões e comentários, por favor.


Quais dispositivos você está almejando?
Marko

22
@Marko - todos eles. Não é a Web se eu excluir alguém.
Fenton

Se você não quiser jQuery, dê uma olhada neste github.com/capriza/mobile-touch
oriharel

Respostas:


101

O jQuery UI Touch Punch resolve tudo.

É um suporte de evento de toque para jQuery UI. Basicamente, ele apenas conecta o evento de toque de volta à UI do jQuery. Testado em iPad, iPhone, Android e outros dispositivos móveis habilitados para toque. Eu usei o jQuery UI classificável e funciona perfeitamente.

http://touchpunch.furf.com/


4
Não funciona no navegador padrão do Android 4.0. Ele funciona no Chrome para dispositivos móveis.
Timmmm

temos de pressionar longamente antes de arrastar? porque quando usamos a largura total no elemento que é capaz de arrastar, queremos rolar para baixo, ele arrasta automaticamente o elemento
CaffeineShots

1
certifique-se de fazer esta sua última declaração <script> no cabeçalho do seu arquivo html, especialmente jquery-ui, ou não funcionará
whyoz

@vichsu Muito obrigado por esta resposta, que resolveu meu problema perfeitamente.
Brady Zhu

realmente não está funcionando no Android 4.0 .. ou há alguma solução alternativa?
rashidnk

23

Há um novo polyfill para traduzir eventos de toque para arrastar e soltar, de forma que o arrastar e soltar HTML5 seja utilizável em dispositivos móveis.

O polyfill foi apresentado por Bernardo Castilho neste post .

Aqui está uma demonstração desse post.

A postagem também apresenta várias considerações sobre o design do folyfill.


7

A versão beta do Sencha Touch tem suporte para arrastar e soltar.

Você pode consultar o Exemplo DnD . A propósito, isso só funciona em navegadores webkit.

Adaptar essa lógica em uma página da web provavelmente será difícil. Pelo que entendi, eles desabilitam todos os panning do navegador e implementam eventos de panning inteiramente em javascript, permitindo a interpretação correta de arrastar e soltar.

Atualização: o link do exemplo original está morto, mas encontrei esta alternativa:
https://github.com/kostysh/Drag-Drop-example-for-Sencha-Touch


Isso é muito interessante, então vou baixá-lo e ter um jogo - testado no Android e funciona principalmente, então só preciso olhar os detalhes - obrigado!
Fenton

6
Ok, provavelmente não usarei essa biblioteca em particular (sendo mais de 200k quando minimizada), mas posso usar os conceitos contidos nela para ter o tipo de ideia. A ideia geral é que você faça com que sua página não possa ser interpretada como maior do que o tamanho da tela, o que engana o navegador móvel para não interceptar os deslizamentos / arrastamentos!
Fenton

1
Então, estamos adicionando um construtor para Touch 1.0 que remove as partes não utilizadas da biblioteca, isso reduzirá substancialmente o espaço ocupado. Além disso, compactado com gzip, a biblioteca completa tem 50-80k.
Michael Mullany

7

Eu precisava criar um arrastar e soltar + rotação que funcionasse em desktop, celular, tablet, incluindo Windows Phone. O último tornou tudo mais complicado (mspointer vs. eventos de toque).

A solução veio da grande biblioteca Greensock

Demorou alguns saltos através de aros para fazer o mesmo objeto arrastável e giratório, mas funciona perfeitamente


Tipo de licença? Livre? Verifiquei o site, mas parece que estão vendendo a biblioteca.
ShanerM13

Já se passaram 6 anos desde que respondi isso. Não tenho certeza se eles mudaram seu tipo de licença. Costumava ser gratuito em 2014 ...
Tomer Almog

IDK como eu esqueci
ShanerM13

Basicamente, é gratuito, desde que seu produto seja gratuito (com a exceção de que eles permitem cobranças únicas), caso contrário, você deve obter uma licença comercial com eles.
ShanerM13

3

Você também pode tentar o polyfill drag-n-drop de Tim Ruffle , certamente semelhante ao de Bernardo Castilho (ver resposta @remdevtec).

Basta fazer npm install mobile-drag-drop --save(outros métodos de instalação disponíveis, por exemplo, com caramanchão)

Então, qualquer interface de elemento que dependa da detecção de toque deve funcionar no celular (por exemplo, arrastar apenas um elemento, em vez de rolar + arrastar ao mesmo tempo).


1

Jquery Touch Punch é ótimo, mas o que ele também faz é desabilitar todos os controles no div arrastável, então para evitar isso você tem que alterar as linhas ... (no momento da escrita - linha 75)

mudança

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

ler

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

adicione quantos ors quiser para cada um dos elementos que deseja 'desbloquear'

Espero que ajude alguém


Definitivamente me ajudou, obrigado. Eu estava criando uma lista de verificação classificável e a caixa de seleção não estava clicando porque o div criado pelo toque estava cobrindo a caixa de seleção. Isso resolveu e funcionou. obrigado ....
Mikeys4u

1

aqui está minha solução:

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

1

A biblioteca Sortable JS é compatível com telas sensíveis ao toque e não requer jQuery.

A maneira como ele lida com telas sensíveis ao toque é que você precisa tocar na tela por cerca de 1 segundo para começar a arrastar um item.

Além disso, eles apresentam um teste de vídeo mostrando que esta biblioteca está sendo executada mais rapidamente do que o JQuery UI Sortable.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.