我已经设置了一个jQuery可排序的列表,但是我需要能够将一些可排序的“固定”项目保留在原位,而其他项目可以对它们进行排序.我认为会有这样的方法来实现这一点,唉,情况并非如此.
我可以设置列表,不包括相关的项目:
<ul id="fruit">
<li class="fixed">apples</li>
<li>oranges</li>
<li>bananas</li>
<li>pineapples</li>
<li>grapes</li>
<li class="fixed">pears</li>
<li>mango</li>
</ul>
<script type="text/javascript">
$('#fruit').sortable({items: "li:not('.fixed')"})
</script>
这阻止我拖放这些项目,但如果它们周围的项目被排序,它们仍然移动.可能有一种方法可以使用这种方法的许多回调,但是我一直无法解决这个问题.
也许这种方法将是一个很好的除了UI可排序的选项?
解决方法
我设法通过修改抖动代码,并将其附加到“更改”事件而不是“停止”.我通过查看索引在拖动项目时如何变化并设置一些条件来完成.它也适用于多个固定元素. “lockto”变量定义固定元素的位置,固定元素最初应处于此位置.您可能会重写此文件并将其包装在一个函数中,因此您不需要手动设置所有固定元素的“lockto”变量.
$("#sortable").sortable({
"cancel":"li.static","change":function(event,ui) {
var lockto = 6;
var thisindex = $(ui.helper).index(fixed);
var fixed = $("#static-"+lockto);
var index = $("#sortable li").index(fixed);
var targetindex = lockto+1;
if(index !== targetindex) {
if(index > targetindex ) {
fixed.prev().insertAfter(fixed); //move it up by one position
} else if(index==(targetindex-1) && thisindex>targetindex) {
//don't move it at all
} else {
fixed.next().insertBefore(fixed); //move it down by one position
}
} else if(index==targetindex && thisindex>targetindex) {
fixed.prev().insertAfter(fixed); //move it up by one position
}
}
});