2013-06-05 112 views
1

我很難結合jquery sortable和selectable。JQuery UI,可排序和可選

我有兩個列表,並希望能夠從一個列表拖動到另一個(其中無可選擇的作品)

但隨着可選擇的,而不是拖着它只是再次選擇,是有辦法禁用選擇在選定的物品上,或將拉手放在選擇手柄的外側,以免干擾。

這是代碼。

$(function() { 
    $(".available, .assigned").sortable({ 
    connectWith: ".connected", 
    handle: ".handle" 
    }); 

    $(".available, .assigned").selectable({ filter: "li", cancel: ".handle" }) 
    $(".available, .assigned").disableSelection(); 
}); 

http://jsfiddle.net/MJYRD/

這是據我已經能夠去關注此問題jQuery UI sortable & selectable

感謝

+0

剛剛使用鏈接答案中的代碼片段有什麼問題?用這段代碼,我很容易[得到這個工作](http://jsfiddle.net/MattiasBuelens/vLM94/)。 –

+0

當你放棄它時,只會拖動被拖動的物品而不是其他選擇的物品,我已經到了我正在實施它的階段。 –

回答

0

這是我的解決方法,使列表可選和排序,並允許套索實現。這裏是fiddle

<html> 
<meta charset="utf-8" /> 
<title>jQuery UI Sortable with Selectable</title> 
<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> 
$(function() { 
// 

$('body').selectable({ 
    filter: 'li' 
    //filter: '#album2 > li' 
}); 

/* 
Since the sortable seems unable to move more than one object at a 
time, we'll do this: 

The LIs should act only as wrappers for DIVs. 

When sorting a LI, move all the DIVs that are children of selected 
LIs to inside the sorting LI (this will make them move together); 
but before doing that, save inside the DIVs a reference to their 
respective original parents, so we can restore them later. 

When the user drop the sorting, restore the DIVs to their original 
parent LIs and place those LIs right after the just-dropped LI. 

Voilá! 

Tip: doesn't work so great if you try to stick the LIs inside the LI 
*/ 

$('.connectedSortable').sortable({ 
    connectWith: ".connectedSortable", 
    delay: 100, 
    start: function(e, ui) { 
     var topleft = 0; 

     // if the current sorting LI is not selected, select 
     $(ui.item).addClass('ui-selected'); 

     $('.ui-selected div').each(function() { 

      // save reference to original parent 
      var originalParent = $(this).parent()[0]; 
      $(this).data('origin', originalParent); 

      // position each DIV in cascade 
      $(this).css('position', 'absolute'); 
      $(this).css('top', topleft); 
      $(this).css('left', topleft); 
      topleft += 20; 

     }).appendTo(ui.item); // glue them all inside current sorting LI 

    }, 
    stop: function(e, ui) { 
     $(ui.item).children().each(function() { 

      // restore all the DIVs in the sorting LI to their original parents 
      var originalParent = $(this).data('origin'); 
      $(this).appendTo(originalParent); 

      // remove the cascade positioning 
      $(this).css('position', ''); 
      $(this).css('top', ''); 
      $(this).css('left', ''); 
     }); 

     // put the selected LIs after the just-dropped sorting LI 
     $('#album .ui-selected').insertAfter(ui.item); 

     // put the selected LIs after the just-dropped sorting LI 
     $('#album2 .ui-selected').insertAfter(ui.item); 
    } 
}); 




// 
}); 


<style> 
*, 
*:before, 
*:after { 
    -webkit-box-sizing: border-box; 
    -moz-box-sizing: border-box; 
    box-sizing: border-box; 
} 

#album { 
    list-style: none; 
    float: left; 
    width: 20%; 
    border: 1px solid blue; 
} 
#album2 { 
    list-style: none; 
    float: left; 
    width: 20%; 
    border: 1px solid blue; 
} 
#album li { 
    float: left; 
    margin: 5px; 
} 

#album2 li { 
    float: left; 
    margin: 5px; 
} 


#album div { 
    width: 100px; 
    height: 100px; 
    border: 1px solid #CCC; 

    background: #F6F6F6;  
} 
#album2 div { 
    width: 100px; 
    height: 100px; 
    border: 1px solid #CCC; 

    background: #F6F6F6;  
} 
#album .ui-sortable-placeholder { 
    border: 1px dashed #CCC; 
    width: 100px; 
    height: 100px; 
    background: none; 
    visibility: visible !important; 
} 
#album2 .ui-sortable-placeholder { 
    border: 1px dashed #CCC; 
    width: 100px; 
    height: 100px; 
    background: none; 
    visibility: visible !important; 
} 

#album .ui-selecting div, 
#album .ui-selected div { 
    background-color: #3C6; 
} 

#album2 .ui-selecting div, 
#album2 .ui-selected div { 
    background-color: #3C6; 
} 

#anotheralbum { 
    list-style: none; 
    float: left; 
    width: 20%; 
    height: 800px; 
    border: 1px solid green; 
} 
</style> 


<body> 

<ul id="album" class="connectedSortable"> 
    <li id="li1"><div>1- First</div></li> 
    <li id="li2"><div>2- Second</div></li> 
    <li id="li3"><div>3- Third</div></li> 
    <li id="li4"><div>4- Fourth</div></li> 
    <li id="li5"><div>5- Fifth</div></li> 
    <li id="li6"><div>6- Sixth</div></li> 
    <li id="li7"><div>7- Seventh</div></li> 
    <li id="li8"><div>8- Eighth</div></li> 
</ul> 

<ul id="album2" class="connectedSortable"> 
    <li id="li1"><div>1- 1</div></li> 
    <li id="li2"><div>2- 2</div></li> 
    <li id="li3"><div>3- 3</div></li> 
    <li id="li4"><div>4- 4</div></li> 
    <li id="li5"><div>5- 5</div></li> 
    <li id="li6"><div>6- 6</div></li> 
    <li id="li7"><div>7- 7</div></li> 
    <li id="li8"><div>8- 8</div></li> 
</ul> 
<div id="anotheralbum" class="connectedSortable"> 
another album - no style for the lists inside here 
</div> 

<br style="clear:both"> 
</body> 
</html> 
1

我設法得到它有點工作。 Check the fiddle.

基本上,我使用了jquery.multisortable插件,它擴展了默認的sortable小部件。這樣,您可以通過Ctrl並單擊它們來選擇多個項目。您可以通過拖動來重新排序和/或在列表之間移動項目。

或者,如果要使用選擇矩形和拖動手柄來堅持原始機構,則仍然可以使用selectabledemo)。唯一的缺點是multisortable後面的行爲multiselectable保持活動狀態,這意味着它仍然嘗試處理Ctrl +單擊(但失敗)。這只是一個小的麻煩,你可以調整代碼multisortable,所以它不會延伸multiselectable這應該解決這個問題。

+0

它似乎沒有做任何事情。我想我有我自己的解決方案。我使用可選擇和可排序的事件來使它們一起工作。 –

+0

@JosephLeBrech什麼不適合你?另外,如果您解決了自己的問題,則可以將該解決方案添加爲[自己回答](http://stackoverflow.com/helpcenter/self-answer)。其他有類似問題的用戶可能會在以後找到這個問題,並找到有用的解決方案。 –

+0

你在jsfiddle下的演示似乎沒有做任何事情。但是,我應該必須解決。我完成後會發布它。 –

0

由於拖動動作與選擇動作大致相同,因此如果已選擇某個項目,則必須取消選擇。

$(".available, .assigned").selectable({ 
    filter: "li", 
    cancel: ".ui-selected" 
}) 

$("available, .assigned").sortable()