2009-08-19 73 views
2

使用Google託管的最新jQuery/UI。我有以下標記:jQuery拖放問題:mousemove事件沒有綁定某些元素

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

而且下面的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 
}); 

});

如果我將第一個li拖過第二個,mousemove函數會激發(並且firebug會記錄輸出)。但是,如果我將第二個li拖過第一個,則mousemove函數不會觸發。你可以在http://jsbin.com/ivala上看到。是否有一個原因?我應該以其他方式捕捉mousemove事件嗎?

編輯:它看起來像mousemove()事件沒有綁定的早期元素比當前正在拖動(應綁定到他們的鼠標懸停)。

+0

我打開鏈接,有時將第二個li拖拽到第一個firebug上記錄輸出。但是,第一個過程比第一個過程更容易。 – 2009-08-19 18:58:05

+0

我也注意到了。這不是regualr行爲;非常令人費解。 – saturdayplace 2009-08-19 21:26:34

+0

你想通過添加mousemove事件來完成什麼? – PetersenDidIt 2009-08-22 15:20:45

回答

7

看來可拖動的幫手元素正在吃掉鼠標移動事件。如果光標位於幫助器上,下面的容器將不會收到mousemove事件。

嘗試定位遊標的助手偏移量,以便遊標永遠不會在其正下方有助手元素。你可以用拖動的cursorAt選項做到這一點:

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

+0

我打算把這個標記爲答案,儘管我問過這個問題已經超過了24個月,現在完全沒有想法,爲什麼我需要這個答案。 – saturdayplace 2011-11-15 18:32:41

+0

:)謝謝。我有類似的問題,並認爲這可能會修復它,並解釋您注意到的間歇性行爲(例如,鼠標移動比拖拉助手更快,在助手捕捉到鼠標之前導致一些鼠標移動事件)。 – Max 2011-11-15 19:17:50

1

你既可以嘗試將pointerEvents CSS樣式添加到您的幫手。這樣,所有事件都會通過拖動的元素。

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

有了完整的可拖動的東西:

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

這是我做了什麼和它的作品。

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