2010-08-15 3 views
17

A avere un div div (una mappa) trascinabile tramite l'interfaccia utente jQuery trascinabile. Il div ha divs figlio che sono cliccabili.come evitare l'UI jQuery trascinabile dall'attivare anche l'evento click

Il mio problema è che se si trascina la mappa, con il mouse su, l'evento click viene attivato su qualsiasi div da bambino da cui è stato avviato il trascinamento.

Come arresto il mouse dall'attivazione dell'evento click se la sua parte di trascinamento (a differenza di qualcuno che fa semplicemente clic senza trascinamento, nel qual caso l'evento click è desiderato).

+0

Ho avuto lo stesso problema e ho trovato una soluzione semplice. Sull'elemento figlio definire 'draggable' prima di' click', come questo: '$ ('elemento'). Draggable ({disabled: true});' – cakan

risposta

3

Potrebbe forse impostare una variabile come "justDragged = true" all'avvio del trascinamento e quindi sull'evento mouseUp controllare questa variabile e se è true, impostarlo su false e quindi eseguire event.preventDefault + return w/o fare qualsiasi cosa In questo modo salta il primo clic dopo il trascinamento. Sembra una specie di hackish, forse altri avranno una soluzione più elegante.

8

Ho avuto questo problema e la soluzione è di applicare il gestore di eventi trascinabile PRIMA del gestore di eventi click. Stavo spostando del codice e improvvisamente ho avuto questo problema. Alla fine ho capito che avevo cambiato l'ordine in cui ho applicato i gestori. Quando l'ho riacceso, le cose hanno iniziato a funzionare correttamente, il trascinamento non ha causato un clic.

+0

Arghh, ho cercato di risolvere questo problema, e desidero il tuo soluzione ha funzionato per me. Ma non è così. Sono su jQuery 1.6.1 – brainjam

+0

Ha funzionato per me! Molto meglio di tutte le altre risposte shnaigans-ey. –

+1

nessuno dei quali funziona per me :-( – ProblemsOfSumit

0

Un'alternativa è quella di semplicemente non permettere il trascinamento dalle aree cliccabili all'interno del trascinabile:

jQuery UI Draggable API

+0

Cura di spiegare i downvotes? – Ryan

47
$('.selector').draggable({ 
    stop: function(event, ui) { 
     // event.toElement is the element that was responsible 
     // for triggering this event. The handle, in case of a draggable. 
     $(event.originalEvent.target).one('click', function(e){ e.stopImmediatePropagation(); }); 
    } 
}); 

Questo funziona perché "one-ascoltatori" vengono sparati prima"normale" ascoltatori. Quindi, se un solo ascoltatore interrompe la propagazione, non raggiungerà mai i listener impostati in precedenza.

+0

http : //jsfiddle.net/qYz9V/2/ ecco il violino di questa risposta :) grazie. –

+3

il violino mostra che funziona, ma per qualche ragione non fa per me ... – WtFudgE

+7

Questa soluzione non funziona in FF 31, event.toElement non è definito. Tuttavia, invece di event.toElement use event.originalEvent.target funzionerà con tutti i browser – Attenzione