Dojo dnd: posicionamento Avatar
-
11-07-2019 - |
Pergunta
É possível alterar o posicionamento do avatar com api dnd dojo do kit de ferramentas? No momento, ao arrastar, o avatar do arrastado aparece de itens para a direita e abaixo do cursor do mouse. Eu quero que seja na mesma posição que o cursor do mouse. Corri alguns testes de usabilidade no meu aplicativo, ea maioria das pessoas parecem tentar para tentar arrastar o avatar para a área de queda, ao invés de mover o cursor sobre a área de queda. Qualquer entrada seria bom. Obrigado!
Solução
Desculpe, não é possível por razões técnicas.
UPDATE: por demandas populares estes são motivos técnicos:
- Quando você tem um certo nó sob o mouse, o nó recebe todos os eventos do mouse.
- O mouse eventos bolha na cadeia pai.
- Agora imagine que você mover este nó com o mouse -. Este nó seria sempre obter todos os eventos do mouse
- Isso significa que qualquer outro nó, por exemplo, um alvo pode não obter eventos do mouse a menos que seja um pai do nó movido. Normalmente, este não é o caso.
Mas eu sei que outras pessoas podem fazê-lo! Deve ser possível! Sim, é possível ... em princípio:
- registrar Vamos todos nós de destino.
- Deixe-captura eventos de movimentação do mouse relevantes diretamente sobre o pai de nível superior (o documento).
- Quando detectar uma operação de arrastar, vamos fazer o seguinte:
- geometria Calcular (caixas delimitadoras) de todos os alvos.
- Em cada movimento do mouse permite verificar se os atuais sobreposições posição do mouse com um alvo. Os pontos de bónus para um estudante de "A +":. detectar sobreposições com outros nós, por exemplo, quando um alvo é parcialmente obscurecem por razões estéticas, e processar esta situação correctamente
- Se as atuais sobreposições posição do mouse com um alvo, vamos iniciar "drop é possível" ações, por exemplo, mostrar algumas sugestões para que o usuário final sabe que ela pode cair agora.
Por Dojo não faz isso? Por uma série de razões técnicas (finalmente chegamos lá!):
- cálculos de geometria de um nó são notoriamente de buggy na maioria dos navegadores. Assim que as tabelas estão envolvidas, ou qualquer outro meio não-triviais de colocação, você não pode ser 100% de certeza que a caixa delimitadora está correto.
- cálculos de geometria é uma operação cara, e nós temos que fazê-lo pelo menos uma vez em cada operação de arrastar para todos os alvos assumindo que nenhuma mudança pode ser feita durante a operação de arrastar (nem sempre o caso). Um navegador pode refluir nós por muitas razões ? pode mover / redimensionar as metas existentes, por isso temos de estar vigilantes.
- Normalmente as caixas calculados são mantidos em uma lista ? verificando a lista de interseções é que O (n) (linear) ? não escala bem como o número de alvos crescer.
- Todos manipuladores de eventos rato deve ser rápido, caso contrário, um navegador rato evento facilidade de manipulação pode ser "quebrado", levando a efeitos colaterais imprevisíveis. Veja os pontos anteriores por razões por que o processamento de eventos do mouse pode ser lento.
- Melhorar na busca linear é possível, por exemplo, pode ser usado em 2D árvores espaciais, mas leva a mais (muito mais) código JavaScript ? mais coisas para download no lado do cliente ? geralmente não vale a pena.
Como eu sei disso? Porque Dojo costumava ter esse tipo de drag'n'drop em versões anteriores, e temos problemas combate doentes e cansados ??que eu descrevi acima. Qualquer melhoria foi uma batalha difícil, o que aumentou o tamanho do código. Finalmente decidimos contra reinventar e replicar mecanismos já construídos em um browser. Um navegador não faz praticamente o mesmo trabalho:. Calcula geometria de nós, encontra o nó subjacente, e despacha um evento movimento do mouse adequadamente
A implementação atual não usar eventos mova o mouse e não calcular a geometria. Em vez disso, conta com mouse sobre / out eventos detectados por alvos depois de uma tragada foi iniciado. Ele funciona de forma confiável e escamas bem.
Outra rugas nessa história: alvos Dojo trata como recipientes - um caso de uso muito comum (carrinhos de compras, reorganizar itens, editar hierarquias). Linear recipientes e árvores genéricos são implementados no momento, recipientes personalizados são possíveis. Ao arrastar e soltar você pode ver e queda arrastou itens em uma posição adequada dentro de um recipiente de destino, por exemplo, inserindo-os entre os itens existentes. A implementação desse recurso usando cálculos geométricos e cheques seria proibitivamente caro.