Domanda

È possibile cambiare il posizionamento dell'avatar con il dnd api di dojo toolkit? Al momento, durante il trascinamento, l'avatar dell'elemento trascinato appare a destra e sotto il cursore del mouse. Voglio che sia nella stessa posizione del cursore del mouse. Ho eseguito alcuni test di usabilità sulla mia applicazione e la maggior parte delle persone sembra tentare di trascinare l'avatar nell'area di rilascio, anziché spostare il cursore sull'area di rilascio. Qualsiasi input sarebbe bello. Grazie!

È stato utile?

Soluzione

Siamo spiacenti, non è possibile per motivi tecnici.

AGGIORNAMENTO: a grande richiesta questi sono motivi tecnici:

  • Quando hai un nodo proprio sotto il mouse, il nodo riceve tutti gli eventi del mouse.
  • Gli eventi del mouse riempiono la catena genitore.
  • Ora immagina di spostare questo nodo con il mouse - questo nodo otterrebbe sempre tutti gli eventi del mouse.
  • Significa che qualsiasi altro nodo, ad es. una destinazione non può ottenere eventi del mouse a meno che non sia un genitore del nodo spostato. In genere non è così.

Ma so che altre persone possono farlo! Dovrebbe essere possibile! Sì, è possibile ... in linea di principio:

  • Registriamo tutti i nodi target.
  • Catturiamo gli eventi di spostamento del mouse rilevanti direttamente sul genitore più in alto (il documento).
  • Quando rileviamo un'operazione di trascinamento, facciamo quanto segue:
    1. Calcola la geometria (riquadri di delimitazione) di tutti i target.
    2. Ad ogni spostamento del mouse, consente di verificare se la posizione corrente del mouse si sovrappone a un bersaglio. Punti bonus per un " A + " studente: rileva sovrapposizioni con altri nodi, ad esempio quando un bersaglio è parzialmente oscuro per motivi estetici ed elabora questa situazione correttamente.
    3. Se la posizione corrente del mouse si sovrappone a un bersaglio, iniziamo "drop è possibile" le azioni, ad esempio, mostrano alcuni segnali in modo che l'utente finale sappia che ora può rilasciare.

Perché Dojo non lo fa? Per una serie di motivi tecnici (finalmente ci siamo arrivati!):

  • I calcoli della geometria di un nodo sono notoriamente buggy nella maggior parte dei browser. Non appena sono coinvolte le tabelle o qualsiasi altro mezzo di posizionamento non banale, non puoi essere sicuro al 100% che il rettangolo di selezione sia corretto.
  • I calcoli della geometria sono un'operazione costosa e dobbiamo eseguirla almeno una volta per ogni operazione di trascinamento per tutti i target, supponendo che non sia possibile apportare modifiche durante l'operazione di trascinamento (non sempre il caso). Un browser può ridisporre i nodi per molte ragioni ? può spostare / ridimensionare gli obiettivi esistenti, quindi dobbiamo essere vigili.
  • In genere le caselle calcolate vengono mantenute in un elenco ? il controllo dell'elenco per le intersezioni è O (n) (lineare) ? non si ridimensiona con il crescere del numero di target.
  • Tutti i gestori di eventi del mouse dovrebbero essere veloci, altrimenti la funzione di gestione degli eventi del mouse di un browser può essere "rotta". portando a effetti collaterali imprevedibili. Vedi i punti precedenti per i motivi per cui l'elaborazione degli eventi del mouse può essere lenta.
  • È possibile migliorare la ricerca lineare, ad es. è possibile utilizzare alberi spaziali 2D, ma porta a più (molto più) codice JavaScript ? più roba da scaricare sul lato client ? in genere non ne vale la pena.

Come lo so? Perché Dojo aveva questo tipo di drag'n'drop nelle versioni precedenti, e abbiamo avuto problemi di lotta stanchi e malati che ho descritto sopra. Qualsiasi miglioramento era una battaglia in salita, che aumentava la dimensione del codice. Alla fine abbiamo deciso di non reinventare e replicare i meccanismi già integrati in un browser. Un browser fa praticamente lo stesso lavoro: calcola la geometria dei nodi, trova il nodo sottostante e invia un evento di spostamento del mouse in modo appropriato.

L'implementazione corrente non utilizza eventi di spostamento del mouse e non calcola la geometria. Si basa invece su eventi di over / out del mouse rilevati dai target dopo l'avvio di un trascinamento. Funziona in modo affidabile e si adatta bene.

Un'altra ruga in questa storia: Dojo tratta gli obiettivi come contenitori: un caso d'uso molto comune (carrelli della spesa, riorganizzazione degli oggetti, modifica delle gerarchie). Al momento sono implementati container lineari e alberi generici, sono possibili container personalizzati. Durante il trascinamento della selezione è possibile visualizzare e rilasciare gli elementi trascinati in una posizione corretta all'interno di un contenitore di destinazione, ad esempio inserendoli tra gli elementi esistenti. L'implementazione di questa funzione mediante calcoli e controlli geometrici sarebbe proibitivamente costosa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top