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()