2013-05-31 43 views
4

後無法工作jQuery Sortable()運行良好,如果我嘗試銷燬並創建可排序的,也很好地工作。 但如果嘗試$(document).unbind('mousemove')並重新創建可排序,它只能工作一次,然後永遠不會工作。 我知道我可以更改代碼。但我想知道爲什麼。

這裏是下面的代碼,還對的jsfiddle(http://jsfiddle.net/webjjin/YJEf5/

<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css"> 
<script src="http://code.jquery.com/jquery-1.9.1.js"></script> 
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script> 

<div id="container"> 
<ul id="sortable"> 
    <li>Item 1</li> 
    <li>Item 2</li> 
    <li>Item 3</li> 
    <li>Item 4</li> 
    <li>Item 5</li> 
</ul> 
</div> 
<button id="btn">Destroy and create</button> 
<button id="unbind">Unbind</button> 

<script>$("#sortable").sortable();</script> 
<script> 
var html = $('#container').html(); 
$('#btn').click(function(){ 
    $("#sortable").sortable('destroy'); 
    $('#container').empty(); 
    setTimeout(function(){ 
     $('#container').append(html); 

     $("#sortable").sortable(); 
    }, 500); 
}); 
$('#unbind').click(function(){ 
    jQuery(document).unbind('mousemove').unbind('mouseup'); 
}) 
</script> 
+0

可排序需要跟蹤鼠標位置,以便您可以拖動對象。與單擊和文件輸入框返回false一樣,它們停止工作。如果您有一個跟蹤鼠標的功能,您可以添加一個全局變量來啓用/禁用您的功能。即'window.notrack = true;',在你的函數中(在它的最上面):'if(window.notrack){return false; }' –

+0

僅用於jQuery 1.7,.off()方法優於.unbind()以移除元素上的事件處理程序。 – j08691

+0

@你爲什麼要刪除所有的事件處理程序,爲什麼你不能只是[禁用](http://api.jqueryui.com/sortable/#method-disable)排序 –

回答

3

有了這個代碼,

jQuery(document).unbind('mousemove').unbind('mouseup'); 

你這是在頁面上刪除ALLmousemovemouseup事件監聽器對於必不可少的jQuery排序。它用於跟蹤拖動元素懸停或放下的位置等功能。所以解除它將打破整個過程。

如果要取消綁定這些事件監聽器,使用特定的選擇:

$('#test').unbind('mousemove').unbind('mouseup'); 
+1

然後再次調用'.sortable()'應該重新註冊這些事件嗎?由於某些原因, –

+1

,sortable()不會綁定'mouseup'。即使在sortable()被調用後它仍然未被綁定。 –

+0

它在解除綁定後應該重新排序()。爲什麼我需要jQuery(文檔).unbind('mousemove')是有幾個其他組件不提供銷燬方法。但我需要銷燬並清空所有這些,然後重新繪製/重新繪製。所以我使用jQuery(document).unbind('mousemove'),因爲我不想介意附加事件。 –

1

最後我找到了原因。

在jQuery-ui文件中。有這個代碼。

var mouseHandled = false; 
$(document).mouseup(function() { 
mouseHandled = false; 
}); 

像這樣_mouseDown功能檢查,

if(mouseHandled) { return; } 

這就是爲什麼如果嘗試的jQuery(文檔).unbind( '鼠標鬆開'),排序部件doen't工作包括其他jQuery的UI部件。

謝謝大家。

+0

但這裏有其他問題。總之有些人可以jQuery(文檔).unbind('mouseup')。爲什麼jquery-ui不提供重新註冊上面的mouseup事件? –

+0

一次執行jQuery(document).unbind('mouseup')。它將永遠不會回來...... -_-! –

+0

http://bugs.jqueryui.com/ticket/9348 –