2011-10-31 29 views
3

我有兩個可排序的列表鏈接在一起。將項目移動到新的可排序:如何引用列表我將元素放到?

我有第一個列表上的事件偵聽器調用「sortupdate」上的函數「A」,當我排序列表中的項目或從另一個列表中接收項目時執行一些功能。

我還有第二個列表上的事件監聽器調用「sortreceive」上的函數「B」,以便在從另一個列表中收到一個項目時執行一些功能。

我的問題是,無論何時將列表1中的內容移動到列表2,函數「A」也會被調用,從而導致我的代碼中出現錯誤。我想在函數「A」的開頭添加一個'if'子句,只有當第一個列表是目標時才運行這個代碼,但是我不知道如何引用目標。

或者有更好的方法來檢查一個項目是否被拖出這個列表?

/*添加當前的代碼*/

$("#divMainMenu").bind("sortupdate", function(event, ui) 
    { dropRootCategory(event,ui);})//when the main menu receives a menu item 
$("ul.divSubMenu ").bind("sortreceive", function(event, ui) 
    { dropSubMenu(event, ui);})//when the main submenu receives a menu item 
function dropRootCategory(event, ui) 
{/*item dropped on root category*/ 
//do some different stuff 
} 
function dropSubCategory(event, ui) 
{//item dropped on a sub submenu 
//do some stuff 
} 

我已經試過檢查目標:

if (event.target.id == 'divMainMenu') { // 

不因爲目標ID保持 'divMainMenu' 不管我在哪裏工作下降到。

下一個我試圖檢查發件人:

if (ui.sender == 'null'){// 

不過,這僅與任何信息填充後,通過sortupdate階段過去了,到了sortreceive,所以它再次引發了代碼運行。

/* ** * ** *下面的答案 每秒更新Keith的想法,我回答了這個用下面的代碼: 在菜單開始,我添加了一個變量保存長度

if ($('#divMainMenu').children().length >= numMenuItems){ 
//do some stuff 
} 
:主菜單

var numMenuItems = $('#divMainMenu').children().length; 

然後我if語句的原始長度0

再次感謝Keith!我要去堅果這一個:)

+0

我們可以看到你到目前爲止嘗試過嗎? –

+0

剛剛更新了一些更多的信息。謝謝基思。 –

回答

4

好吧,我真的找到了另一個答案。
通過定義排序,以及一個函數調用停止事件時,把一個標誌添加到啓動事件:

$('ul.divSortable').sortable({ 
    items: "li:not(.liEdit)", //cancel: ".liEdit", 
    connectWith: '.divSortable', 
    start: function(event, ui) { setOriginalSub(ui); },   
    stop: function(event, ui) { isBeingSorted = false; sortSorter(event, ui); } 
}); 

和功能,分選前抓住ID發生:

function setOriginalSub(ui) 
{ 
    originalSub = $(ui.item[0]).parent().attr('id'); 
} 

我現在可以將原始ID與當前ID進行比較。

function sortSorter(event, ui){ 
    var parentID = $(ui.item[0]).parent().attr('id'); 
} 

輝煌,我不會想到沒有基思的幫助!

3

可以使用ui.sender根據排序文檔嘗試:

「ui.sender - 如果你從一個連接列表中移動在項目來自排序(只存在到另一個)「

這看起來像你在找什麼。

+0

我試過如果(ui.sender =='null'){//只有在它通過sortupdate階段並進入sortreceive之後纔會填充任何信息,因此它再次觸發代碼運行。 –

+0

我明白你的意思了。那麼你可以採取不同的方法,並檢查divMainMenu中排序元素的數量是否已經改變。如果它已經改變(即減少1),那麼你知道該元素已從列表中刪除並放入subMenu。 –

+0

輝煌的基思!這完全奏效!我會稍後發佈我的代碼。謝謝! –

1

我一直在尋找同樣的事情,已經發現,在這裏工作,我(所有信貸phpduck,我只發現了這一點)

http://phpduck.com/jquery-ui-sortable-drag-items-between-two-lists/

$(function() { 
 
    var oldList, newList, item; 
 
    $(".categories-sortable").sortable({ 
 
     connectWith: $('.categories-sortable'), 
 
     start: function (event, ui) { 
 
      item = ui.item; 
 
      newList = oldList = ui.item.parent(); 
 
     }, 
 
     stop: function (event, ui) { 
 
      console.log("Moved " + item.text() + " from " + oldList.attr('id') + " to " + newList.attr('id')); 
 
     }, 
 
     change: function (event, ui) { 
 
      console.log(ui.sender); 
 
      
 
      if (ui.sender) { 
 
       newList = ui.placeholder.parent(); 
 
      } 
 
     }, 
 
    }) 
 
     .disableSelection(); 
 

 
});

解決方案

此外,還有一個小提琴:http://jsfiddle.net/ajberri/hEJF3/

相關問題