2010-08-15 24 views
17

A tiene un div grande (un mapa) que se puede arrastrar mediante jQuery UI arrastrable. El div tiene divs para niños en los que se puede hacer clic.cómo evitar jQuery UI arrastrable desde también activar evento click

Mi problema es que si arrastra el mapa, con el mouse hacia arriba, el evento click se activa en cualquier div del niño desde el que inició el arrastre.

¿Cómo puedo detener el mouse desde la activación del evento click si es parte de un arrastre (en lugar de simplemente hacer clic sin arrastrar, en cuyo caso se desea el evento click).

+0

Tuve el mismo problema y encontré una solución simple. En el elemento secundario, defina 'draggable' antes de' click', así: '$ ('element'). Draggable ({disabled: true});' – cakan

Respuesta

3

¿Podría quizás establecer una variable como "justDragged = true" al iniciar la operación de arrastrar y luego en el evento mouseUp comprobar esta variable y si es verdadero, configurarlo en false y luego hacer un event.preventDefault + return w/o haciendo algo. De esta manera, se salta el primer clic después del arrastre. Parece un poco hackish, quizás otros tendrán una solución más elegante.

8

Tuve este problema y la solución es aplicar el controlador de eventos arrastrable ANTES del controlador de eventos click. Estaba cambiando el código y de repente tuve este problema. Finalmente me di cuenta de que había cambiado el orden en el que apliqué los controladores. Cuando lo cambié de nuevo, las cosas empezaron a funcionar correctamente otra vez; el arrastre no causó un clic.

+0

Arghh, he estado tratando de solucionar este problema, y ​​deseo su solución funcionó para mí. Pero no es así Estoy en jQuery 1.6.1 – brainjam

+0

¡Funcionó para mí! Mucho mejor que todos los shnanigans-ey otras respuestas. –

+1

ninguno de los cuales funciona para mí :-( – ProblemsOfSumit

0

Una alternativa es simplemente no permitir que arrastra desde las zonas se puede hacer clic en el arrastrable:

jQuery UI Draggable API

+0

Cuidar para explicar los votos negativos? – 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(); }); 
    } 
}); 

Esto funciona porque "one-oyentes" se disparan antes"normal" oyentes. Entonces, si un solo oyente detiene la propagación, nunca llegará a los oyentes previamente establecidos.

+0

http : //jsfiddle.net/qYz9V/2/ aquí está el violín de esta respuesta :) gracias. –

+3

el violín muestra que está funcionando, pero por alguna razón no funciona para mí ... – WtFudgE

+7

Esta solución no funciona en FF 31, event.toElement no está definido. Sin embargo, en lugar de event.toElement use event.originalEvent.target, funcionará en todos los navegadores – Attenzione

Cuestiones relacionadas