Eu uso jQuery.click
para manipular o evento clique do mouse no gráfico Raphael, enquanto isso, eu preciso lidar com rato drag
evento, arrastar do mouse consiste em mousedown
, mouseup
e mousemove
em Raphael.
É difícil distinguir click
e drag
porque click
também contém mousedown
& mouseup
, Como posso distinguir o mouse "clique" e o mouse "arraste" em Javascript?
javascript
dom-events
Leem
fonte
fonte
mousedown
e emmouseup
vez de ouvir omousemove
evento para definir um sinalizador. Além disso, resolveria o problema mencionado por @mrjrdnthmsCaso você já esteja usando o jQuery:
fonte
drag
. Um escopo extra, como outros comentários estão dizendo, pode ser necessário aqui.evt
e comparando com a posição do segundoevt
, de modo que, por exemplo:if (evt.type === 'mouseup' || Math.abs(evt1.pageX - evt2.pageX) < 5 || Math.abs(evt1.pageY - evt2.pageY) < 5) { ...
..on('mouseup mousemove touchend touchmove')
e, além disso, não define variáveis de posição. Ótima solução!Limpador ES2015
Não apresentou nenhum erro, como outros comentam.
fonte
Isso deve funcionar bem. Semelhante à resposta aceita (embora usando jQuery), mas o
isDragging
sinalizador é redefinido apenas se a nova posição do mouse for diferente da posição nomousedown
evento. Ao contrário da resposta aceita, funciona em versões recentes do Chrome, ondemousemove
é acionado independentemente de o mouse ter sido movido ou não.Você também pode ajustar a verificação de coordenadas
mousemove
se desejar adicionar um pouco de tolerância (por exemplo, trate pequenos movimentos como cliques, não como arrastamentos).fonte
Se você deseja usar o Rxjs :
Este é um clone direto do que o @ wong2 fez em sua resposta, mas foi convertido em RxJs.
Também uso interessante de
sample
. Osample
operador pegará o valor mais recente da fonte (merge
demousedown
emousemove
) e o emitirá quando o observável interno (mouseup
) emitir.fonte
Como mrjrdnthms aponta em seu comentário sobre a resposta aceita, isso não funciona mais no Chrome (sempre aciona o mouse), adaptei a resposta de Gustavo (já que estou usando o jQuery) para abordar o comportamento do Chrome.
A
Array.prototype.equals
função vem desta respostafonte
[evt.pageX, evt.pageY].equals()
comando. Eu substituí isso por(evt.pageX === currentPos[0] && evt.pageY===currentPos[1])
, e tudo estava bem. :)equals
código precisa ser adicionado a partir do link na parte inferior do meu post #currentPos
emmousemove
? Isso não significa que você trataria alguns drags como cliques?"mouseup"
ainda estiver movendo o mouse.Todas essas soluções interrompem pequenos movimentos do mouse ou são complicadas demais.
Aqui está uma solução adaptável simples usando dois ouvintes de eventos. Delta é a distância em pixels que você deve mover horizontalmente ou verticalmente entre os eventos para cima e para baixo para que o código o classifique como um arrasto em vez de um clique. Isso ocorre porque algumas vezes você move o mouse ou o dedo alguns pixels antes de levantá-lo.
fonte
delta
é usado para isso? é algo a ver com toque no dispositivo móvel?delta
são usadas para "Seria frustrante tentar clicar e obter uma operação de arrastar devido a umaUsando o jQuery com um limite de 5 pixels x / y para detectar o arrasto:
fonte
Se apenas para filtrar a caixa de arrastar, faça o seguinte:
fonte
JS puro com DeltaX e DeltaY
Este DeltaX e DeltaY, conforme sugerido por um comentário na resposta aceita, evitam a experiência frustrante ao tentar clicar e obter uma operação de arrastar, devido a um movimento de uma marca.
fonte
Para uma ação pública em um mapa OSM (posicionar um marcador ao clicar), a pergunta era: 1) como determinar a duração do mouse para baixo-> para cima (você não pode imaginar criar um novo marcador para cada clique) e 2) fez o mouse se move durante o down-> up (ou seja, o usuário está arrastando o mapa).
fonte
Outra solução usando JS de baunilha baseado em classe usando um limite de distância
E adicione à classe (SOMESLIDER_ELEMENT também pode ser um documento para ser global):
fonte
Se você deseja verificar o comportamento de clicar ou arrastar de um elemento específico, você pode fazer isso sem ter que ouvir o corpo.
fonte
da resposta de @Przemek,
fonte