Panzoom: O Panzoom oculta o evento de mousedown de subitens no Chrome mais recente

Criado em 7 dez. 2016  ·  12Comentários  ·  Fonte: timmywil/panzoom

Eu usei este plugin incrível com jquery.draggable para o diagrama panorâmico / zoom com nós arrastáveis,
mas após a última atualização do Chrome, os nós tornam-se impossíveis de arrastar.

Poucas investigações mostraram que o Chrome mudou algo com seu evento pointerdown,
então agora o plugin panzoom responde pelo evento pointerdown do nó filho antes de ser disparado o evento mousedown.
Panzoom suprime o evento pointerdown e, por alguma razão, não há evento mousedown depois disso, portanto, o arrastamento não começa.

jquery.panzoom.js v3.2.2
jquery 3.1.0 ou v1.11.3
jqueryui 1.12.0 ou 1.10.3
Chrome 55.0.2883.75 (64 bits) Ubuntu 16.04

Aqui está uma demonstração
http://codepen.io/yurigor/pen/yVjeGB

Eu adicionei a opção 'ignoreChildrensEvents' para corrigir este problema
Não tenho certeza se devo fazer uma solicitação pull com essas alterações.

Comentários muito úteis

Feliz por ajudar!
Qualquer pessoa que também precise, aqui está um link direto:
https://github.com/YuriGor/jquery.panzoom/tree/ignoreChildrensEvents/dist

@timmywil , se você deseja mesclar minhas alterações, me ajude com o grunhido, por favor.
Eu começo o carregamento de fígado por
grunt watch:dev
mas não funciona.
Em http: // localhost : 35711 / eu tenho
{"tinylr":"Welcome","version":"0.2.1"}
e em
http: // localhost : 35711 / test / index.html
ou
http: // localhost : 35711 / demo / index.html
eu tenho
{"error":"not_found","reason":"no such route"}

Todos 12 comentários

Estou tendo o mesmo problema, o Chrome v55. Tenho uma janela arrastável e quero obter eventos do mouse para crianças. O que você fez para consertar isso? você tem uma filial com a mudança, estou preso por enquanto.

encontrei seu branch e ele corrige meu problema muito bem. Obrigado YuriGor isso é maravilhoso

Feliz por ajudar!
Qualquer pessoa que também precise, aqui está um link direto:
https://github.com/YuriGor/jquery.panzoom/tree/ignoreChildrensEvents/dist

@timmywil , se você deseja mesclar minhas alterações, me ajude com o grunhido, por favor.
Eu começo o carregamento de fígado por
grunt watch:dev
mas não funciona.
Em http: // localhost : 35711 / eu tenho
{"tinylr":"Welcome","version":"0.2.1"}
e em
http: // localhost : 35711 / test / index.html
ou
http: // localhost : 35711 / demo / index.html
eu tenho
{"error":"not_found","reason":"no such route"}

Muito obrigado. esta correção não foi suficiente para mim, mas eu mesmo adicionei alguns para corrigi-lo para o meu caso. (tenho vários filhos aninhados, alguns deles devem ser ignorados e outros não)

@timmywil É possível lançar uma nova versão com esta opção?

Edit: Na verdade, tenho o mesmo problema que Romi45. 😞

Edição 2: uma opção para listar quais elementos ignorar seria útil, como:

ignoreChildEventsFrom: [".things-to-ignore1", ".things-to-ignore2"]

Edit 3: Acho que encontrei a solução no FAQ "Como faço os links funcionarem se eles estiverem dentro de um elemento Panzoom?".

o que faço é comentar o preventDefault na linha 969. preventDefault impedirá que o evento alcance seus filhos.

@akhnaz ,

Do meu entendimento, preventDefault impedirá a ação padrão associada a um elemento (um filho ou o próprio elemento panzoom) e stopPropagation impedirá que os eventos borbulhem em um elemento pai.

Há uma solução simples e elegante no FAQ:


  1. Como faço os links funcionarem se eles estiverem em um elemento Panzoom? exemplo
  • A propagação de eventos é interrompida para eventos mousedown e touchstart para permitir elementos Panzoom dentro dos elementos Panzoom. Para corrigir os links, vincule um manipulador de eventos que evite que o evento alcance o manipulador Panzoom:
$('.panzoom a').on('mousedown touchstart', function( e ) {
  e.stopImmediatePropagation();
});

Isso não requer alterações na própria biblioteca.

Hi @ glen-84

Sim, preventDefault impedirá a ação padrão. Mas, também impedirá mouseDown do filho quando o ponteiroDown estiver sendo despachado e ouvido.

No Chrome 55, o pointerDown agora é despachado e o microsoft edge já implementa o pointerDown desde o início.

No meu caso, panzoom é ouvido em pointerDown e os filhos em mouseDown.

Aqui está o meu jsbin para isso:

https://jsbin.com/yozotuxina/edit?js

@akhnaz ,

Você pode simplesmente ouvir pointerdown no filho e interromper a propagação imediata ...

https://jsbin.com/sicapuledo/edit?html , js, console, saída

Oi,

Eu melhorei um pouco seu recurso. Eu anulo sua opção para um possível conjunto de classes. O objetivo é ignorar eventos apenas se os filhos tiverem uma das classes listadas. Claro, apenas definir o valor como verdadeiro funcionará conforme você o implementou.

Não tenho muito tempo para fazer o fork corretamente e fazer uma solicitação de pull. Por favor, inclua essa pequena melhoria e solicite um pull no repositório principal.

Aqui está o código atualizado de suas linhas de bifurcação 959:

if (!options.disablePan || !options.disableZoom) {
    events[ str_start ] = function(e) {
        if(options.ignoreChildrensEvents) {
            if($.isArray(options.ignoreChildrensEvents)) {
                if(options.ignoreChildrensEvents.find(function(c){return $(e.target).hasClass(c);})) {
                    return;
                }
            }
            else if(e.target !== this){
                return;
            }
        }

        var touches;
                /* rest of code */

A opção ignoreChildrensEvents pode ser definida como true, false ou ['child-class1', 'child-class2'].

Cumprimentos

libere uma versão mais recente que contém ignoreChildrensEvents

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

rpallares picture rpallares  ·  3Comentários

kylegoines picture kylegoines  ·  4Comentários

ronvillalon picture ronvillalon  ·  8Comentários

nich008 picture nich008  ·  14Comentários

nsshunt picture nsshunt  ·  20Comentários