Como você pode detectar que um usuário passou o dedo em alguma direção em uma página da Web com JavaScript?
Eu queria saber se havia uma solução que funcionaria para sites no iPhone e um telefone Android.
Como você pode detectar que um usuário passou o dedo em alguma direção em uma página da Web com JavaScript?
Eu queria saber se havia uma solução que funcionaria para sites no iPhone e um telefone Android.
Respostas:
Exemplo simples de código JS baunilha:
Testado no Android.
fonte
touchstart
,touchmove
?Com base na resposta de @ givanse, é assim que você pode fazer isso com
classes
:Você pode usá-lo assim:
fonte
.bind
de indefinido porquehandleTouchMove
na verdade não retornou nada. Também é inútil para chamar ligam ao chamar função comthis.
porque ele já é obrigado a actual contexto.bind(this);
e funcionou normalmente. Obrigado @nicholas_rtouches[0]
parachangedTouches[0]
e o tipo de manipulador de eventoshandleTouchMove
parahandleTouchEnd
run()
duas vezes e você terá um vazamento de memória desagradávelMesclei algumas das respostas aqui em um script que usa o CustomEvent para disparar eventos com swip no DOM. Adicione o script swiped-events.min.js de 0,7k à sua página e ouça eventos swiped :
deslizou para a esquerda
deslizou para a direita
roubado
deslocado
Você também pode anexar diretamente a um elemento:
Configuração opcional
Você pode especificar os seguintes atributos para ajustar como a interação de furto funciona na sua página (esses são opcionais) .
O código fonte está disponível no Github
fonte
o que eu usei antes é que você precisa detectar o evento de redução do mouse, registrar sua localização x, y (o que for relevante), detectar o evento de mouseup e subtrair os dois valores.
fonte
O jQuery Mobile também inclui suporte para furto: http://api.jquerymobile.com/swipe/
Exemplo
fonte
Descobri que a resposta brilhante da @givanse é a mais confiável e compatível em vários navegadores móveis para registrar ações de furto.
No entanto, é necessário alterar seu código para fazê-lo funcionar nos navegadores móveis modernos que estão sendo usados
jQuery
.event.touches
não existirá sejQuery
for usado e resultarundefined
e deve ser substituído porevent.originalEvent.touches
. SemjQuery
,event.touches
deve funcionar bem.Então a solução se torna,
Testado em:
fonte
event.originalEvent
. A coisa éevent.touches
deixou de existir agora e resulta emundefined
.event.originalEvent
. Vou atualizar minha resposta. Obrigado! :)Reembalei
TouchWipe
como um plugin jquery curto:detectSwipe
fonte
Algum mod de resposta mais animada (não posso comentar ...) para lidar com furtos curtos
fonte
lixeira, furto de tempo limite, swipeBlockElems add.
fonte
Se alguém estiver tentando usar o jQuery Mobile no Android e tiver problemas com a detecção de furto JQM
(Eu tinha alguns no Xperia Z1, Galaxy S3, Nexus 4 e alguns telefones Wiko também) isso pode ser útil:
O furto no android não foi detectado, a menos que fosse um furto muito longo, preciso e rápido.
Com essas duas linhas, funciona corretamente
fonte
$.event.special.swipe.scrollSupressionThreshold = 8;
mas você me colocou na direção certa! Obrigado!Eu tive problemas com o manipulador de touchend disparando continuamente enquanto o usuário arrastava um dedo. Não sei se isso é devido a algo que estou fazendo de errado ou não, mas religuei isso para acumular movimentos com touchmove e touchend realmente aciona o retorno de chamada.
Eu também precisava ter um grande número dessas instâncias e, portanto, adicionei os métodos de habilitação / desabilitação.
E um limite em que um golpe curto não é acionado. O toque inicial zero é os contadores de cada vez.
Você pode alterar o target_node em tempo real. Ativar na criação é opcional.
fonte
Também mesclei algumas respostas, principalmente a primeira e a segunda com classes, e aqui está minha versão:
Posteriormente pode usá-lo da seguinte maneira:
Isso ajuda a evitar erros de console quando você deseja chamar apenas, digamos, o método "onLeft".
fonte
Usou dois:
jQuery mobile: funciona na maioria dos casos e especialmente quando você está desenvolvendo aplicativos que usam outro plug-in jQuery, então é melhor usar controles móveis jQuery para isso. Visite-o aqui: https://www.w3schools.com/jquerymobile/jquerymobile_events_touch.asp
Hora do martelo! uma das melhores, leves e rápidas bibliotecas baseadas em javascript. Visite-o aqui: https://hammerjs.github.io/
fonte
Se você só precisa deslizar, é melhor usar o tamanho apenas usando a peça que precisa. Isso deve funcionar em qualquer dispositivo de toque.
Isso é ~ 450 bytes 'após a compressão gzip, minificação, babel etc.
Eu escrevi a classe abaixo com base nas outras respostas, ela usa a porcentagem movida em vez de pixels e um padrão de despachante de evento para prender / soltar as coisas.
Use-o assim:
fonte
Eu queria detectar apenas o furto esquerdo e direito, mas acionar a ação somente quando o evento de toque terminar , então modifiquei levemente a ótima resposta do @ givanse para fazer isso.
Por que fazer isso? Se, por exemplo, enquanto desliza, o usuário percebe que ele finalmente não quer deslizar, ele pode mover o dedo na posição original (um aplicativo de telefone "namoro" muito popular faz isso;)) e, em seguida, o "deslizar para a direita" evento é cancelado.
Portanto, para evitar um evento "deslize para a direita" apenas porque há uma diferença de 3px horizontalmente, adicionei um limite no qual um evento é descartado: para ter um evento "deslize para a direita", o usuário deve deslizar pelo menos 1/3 da largura do navegador (é claro que você pode modificar isso).
Todos esses pequenos detalhes aprimoram a experiência do usuário. Aqui está o código (Vanilla JS):
fonte
Exemplo simples de baunilha JS para deslizar horizontal:
Você pode usar a mesma lógica para deslizar verticalmente.
fonte
Adicionando a esta resposta aqui . Este adiciona suporte para eventos do mouse para teste na área de trabalho:
fonte
Eu reformulei a solução da @givanse para funcionar como um gancho do React. A entrada é alguns ouvintes de eventos opcionais, a saída é uma ref funcional (precisa ser funcional para que o gancho possa executar novamente quando / se a ref for alterada).
Também incluído nos parâmetros de limiar de furto vertical / horizontal, para que pequenos movimentos não acionem acidentalmente os ouvintes do evento, mas eles podem ser configurados como 0 para imitar mais de perto a resposta original.
Dica: para obter o melhor desempenho, as funções de entrada do ouvinte de eventos devem ser memorizadas.
fonte
Um exemplo de como usar com deslocamento.
fonte
Você pode ter mais facilidade para implementá-lo primeiro com eventos de mouse para criar protótipo.
Há muitas respostas aqui, incluindo a parte superior, que devem ser usadas com cautela, pois não consideram casos de arestas, especialmente em torno de caixas delimitadoras.
Vejo:
Você precisará experimentar os casos e comportamentos de ponta, como o ponteiro se movendo para fora do elemento antes de terminar.
Um furto é um gesto muito básico, que é um nível mais alto de processamento da interação do ponteiro da interface, aproximadamente entre o processamento de eventos brutos e o reconhecimento de manuscrito.
Não existe um método exato para detectar um golpe ou arremesso, embora praticamente todos geralmente sigam um princípio básico de detectar um movimento através de um elemento com um limite de distância e velocidade ou velocidade. Você pode simplesmente dizer que, se houver um movimento em 65% do tamanho da tela em uma determinada direção dentro de um determinado período de tempo, é um golpe. Exatamente onde você desenha a linha e como calcula, depende de você.
Alguns também podem vê-lo da perspectiva do momento em uma direção e a que distância da tela ele foi pressionado quando o elemento foi liberado. Isso fica mais claro com furtos pegajosos, nos quais o elemento pode ser arrastado e, ao ser liberado, se recupera ou voa para fora da tela, como se o elástico quebrasse.
Provavelmente, é ideal tentar encontrar uma biblioteca de gestos que você possa portar ou reutilizar, normalmente usada para obter consistência. Muitos dos exemplos aqui são excessivamente simplistas, registrando um furto como o menor toque em qualquer direção.
O Android seria a escolha óbvia, embora tenha o problema oposto, é excessivamente complexo.
Muitas pessoas parecem ter interpretado mal a pergunta como qualquer movimento em uma direção. Um furto é um movimento amplo e relativamente breve em uma única direção (embora possa ser arqueado e ter certas propriedades de aceleração). Uma aventura é semelhante, embora pretenda impulsionar casualmente um item a uma distância razoável, sob seu próprio momento.
Os dois são suficientemente semelhantes que algumas bibliotecas podem fornecer apenas arremessar ou deslizar, o que pode ser usado de forma intercambiável. Em uma tela plana, é difícil separar verdadeiramente os dois gestos e, de maneira geral, as pessoas estão fazendo os dois (passando a tela física, mas jogando o elemento da interface do usuário exibido na tela).
Sua melhor opção é não fazer você mesmo. Já existe um grande número de bibliotecas JavaScript para detectar gestos simples .
fonte