2009-08-19 5 views
2

Verwenden der neuesten jQuery/UI, die bei Google gehostet werden. Ich habe das folgende Markup bekam:jQuery Drag/Drop-Problem: mousemove Event nicht verbindlich für einige Elemente

<ul id="tree"> 
    <li><a href="1/">One</a></li> 
<li><a href="2/">Two</a></li> 
</ul> 

Und die folgende javascript:

$(document).ready(function(){ 

    // Droppable callbacks 
function dragOver(overEvent, ui_object) { 
    $(this).mousemove(function(moveEvent){ 
     console.log("moved over", this); 
    }); 
} 

function drop_deactivate() { 
    $(this).unbind(); 
} 

function drag_out() { 
    $(this).unbind(); 
} 

// Actual dragging 
$("#treeContainer li").draggable({ 
    revert: true, 
    revertDuration: 0 
}); 

// Actuall dropping 
$("a").droppable({ 
    tolerance: "pointer", 
    over: dragOver, 
    deactivate: drop_deactivate, 
    out: drag_out 
}); 

});

Wenn ich die erste li über die zweite ziehen, wird die MouseMove-Funktion ausgelöst (und Firebug protokolliert die Ausgabe). Aber wenn ich die zweite li über die erste ziehe, wird die Mousemove-Funktion nicht ausgelöst. Sie können dies live unter http://jsbin.com/ivala sehen. Gibt es einen Grund dafür? Sollte ich das mousemove-Ereignis auf andere Weise einfangen?

Edit: Es scheint, als wäre das mouse move() -Ereignis für frühere Elemente nicht bindend, als das, das gerade gezogen wird (sollte beim MouseOver gebunden werden).

+0

Ich öffnete den Link und manchmal ziehen die zweite Li über den ersten Firebug protokolliert die Ausgabe. Aber es ist viel einfacher, den ersten über den zweiten zu ziehen. –

+0

Ich habe das auch bemerkt. Es ist kein regelmäßiges Verhalten; sehr rätselhaft. – saturdayplace

+0

Was möchten Sie erreichen, indem Sie das mousemove-Ereignis hinzufügen? – PetersenDidIt

Antwort

7

Es scheint, dass das Helferelement des ziehbaren Elements die Mausbewegungsereignisse isst. Wenn sich der Cursor über dem Helfer befindet, erhält der Container darunter keine mousemove-Ereignisse.

Versuchen Sie, den Helper-Offset vom Cursor zu positionieren, so dass der Cursor nie direkt das Hilfselement darunter hat. Sie können cursorAt Option tun dies ist mit ziehbar:

draggable({ cursorAt: { top: 5, left: 5 } })

+0

Ich werde dies als die Antwort markieren, auch wenn es> 24 Monate her ist, seit ich gefragt habe und jetzt absolut KEINE IDEE habe, warum ich das brauchte. – saturdayplace

+0

:) Danke. Ich hatte ein ähnliches Problem und dachte, dass dies wahrscheinlich behebt und erklärt das intermittierende Verhalten, das Sie bemerkten (z. B. die Maus bewegt sich schneller als der Drag-Helfer, verursacht einige Mausbewegungsereignisse, bevor der Helfer die Maus einholt). – Max

1

könnten Sie entweder versuchen, die pointerEvents CSS Stil zu Ihrem Helfer hinzuzufügen. Auf diese Weise würden alle Ereignisse das gezogene Element passieren.

clone.css('pointerEvents', 'none'); 

Mit der vollen ziehbar stuff:

element.draggable({ 
    helper: function() { 
     var clone = element.clone(); 
     clone.css('pointerEvents', 'none'); 
     return clone; 
    } 
}) 
2

Dies ist, was ich getan habe und es funktioniert.

$(dragMe).draggable({ 
    start : function(e){ 
      $(this).css({'pointer-events': 'none'}); 
     }, 
    stop: function(e){ 
      $(this).css({'pointer-events': 'all'}); 
     } 
})