gpt4 book ai didi

jquery - 使用 jQuery UI 使可拖动元素可在可放置元素中排序

转载 作者:行者123 更新时间:2023-12-03 22:27:40 24 4
gpt4 key购买 nike

已解决

因此,我对 sortable()connectWith 属性进行了更多研究,发现解决方案比我预期的要简单,但我有点倒退地思考它,因为draggable()droppable()

这是 fiddle :http://jsfiddle.net/DKBU9/12/

<小时/>

原始问题如下:

这是之前一个 SO 问题的延伸,我认为应该将其分开。

原来的问题在这里:jQuery UI - Clone droppable/sortable list after drop event 。它涉及在克隆元素上重新初始化可放置处理程序。

除此之外,我试图允许从初始列表中拖动的元素在可放置列表中进行排序。

这是一个 fiddle ,本质上说明了原始问题导致的当前行为:http://jsfiddle.net/DKBU9/7/

以及所需的代码,因为 SO 喜欢提示和夸大这些帖子:

HTML

<ul id="draggables">

<li>foo1</li>
<li>foo2</li>
<li>foo3</li>

</ul>

<ul class="droppable new">

</ul>

JS

$(function() {

$('#draggables > li').draggable({
appendTo: 'document',
revert: 'invalid'
});

$('.droppable > li').draggable({
appendTo: 'document',
revert: 'invalid'
});

$('#draggables').droppable({
accept: '.droppable > li',
drop: function(event, ui) {
ui.draggable.detach().css({top: 0,left: 0}).appendTo($(this));
cleanUp();
}
});

initDrop($('.droppable'));

});

function initDrop($element) {

$element.droppable({
accept: function(event, ui) {
return true;
},
drop: function(event, ui) {
if($(this).hasClass('new')) {
var clone = $(this).clone();
$(this).after(clone);
$(this).removeClass('new');
initDrop( clone );
}
ui.draggable.detach().css({top: 0,left: 0}).appendTo($(this));
cleanUp();
}
}).sortable({
items: 'li',
revert: false,
update: function() {
cleanUp();
}
});

}

function cleanUp() {

$('.droppable').not('.new').each(function() {
if($(this).find('li').length == 0) {
$(this).remove();
}
});

}

引用问题:Jquery UI combine sortable and draggable

我一直在尝试使用这个问题来解决我的问题,因为结果正是我想要实现的目标,特别是已接受答案的评论中提供的最后一个 fiddle ,但我似乎无法考虑到细微的差异,找出如何使其适应我的代码。例如,该问题中的 fiddle 克隆了可拖动元素,而不是拖动实际元素,并且与我的不同,不允许将元素拖回到初始列表中。

因此,任何尝试为我的代码获得该结果的帮助将不胜感激。

此外,在该示例中,accept 属性被设置为返回 true 的函数。这是什么原因呢?这不是意味着它会接受任何东西,或者任何可拖动的元素吗?

编辑:我读了几个仅使用 sortable() 和 connectWith 属性的答案,但出于某种原因,我认为它没有达到我需要的效果,部分原因是我不希望初始列表可排序以及。然而,单独使用 sortable() 似乎可以获得我想要的功能,但我只是还没有适应所有事件处理程序。

最佳答案

参见this fiddle

这将使项目在新列表中可放置和可排序,但在初始列表中则不然(根据您的编辑)。

有一些技巧:

1) 从可拖动开始,我添加了一个新函数,因为我们需要留下一个占位符(使用克隆),以便容器在拖动过程中不会跳跃,并且我们需要将新元素初始化为可拖动。

function initDraggable($element)
{
$($element).draggable({
connectToSortable: '.droppable',
revert: function(droppableObj)
{
if(droppableObj === false)
{
$(this).removeClass('dragging');
return true;
}
else
{
return false;
}
},
helper: 'clone',
start: function(e, ui)
{
$draggingParent = $(this).parent();
$(this).addClass('dragging');
}
});
}

注意 connectToSortable:.droppable (作为清理,我认为你应该将 droppable 更改为 sortable);

另请注意恢复: - 这使我们有机会在恢复时删除“拖动”类(这使得原始(克隆)元素不可见)。

最后,start 添加了“拖动”类,使原始(克隆)元素在拖动过程中不可见。它还设置 $draggingParent,用于检查项目是否是从 #draggables.droppables 拖动的。

2) 然后是 #draggablesdroppable():

 $("#draggables").droppable({    
drop: function(ev, ui) {
if($draggingParent[0] === $(ui.helper).parent()[0])
{
//dragged from draggables to draggables
$(ui.draggable).removeClass('dragging');
}
else
{
if(ui.draggable.parent())
var $clone = $(ui.draggable).clone();
$(ui.draggable).remove();
$clone.removeClass();
$clone.removeAttr('style');
initDraggable($clone);
$(this).append($clone);
}
}

请注意,drop 处理程序会检查此元素是否从 #draggables.droppables 中删除,并采取相应的操作。

3)最后,正如您已经提到的,我们真的希望 droppable 可以排序:

function initDroppableSort($element) {       
$element.sortable({
items: 'li',
connectWith: ".droppable,#draggables",
revert: true,
stop: function(event, ui) {
$(ui.item).removeClass('dragging');
$('.dragging').remove();
if($(this).hasClass('new')) {
var clone = $(this).clone();
clone.empty();
$(this).after(clone);
$(this).removeClass('new');
initDroppableSort( clone );
}
cleanUp();
}
});

}

请注意 connectWith,特别是它引用 .droppable#draggables

关于jquery - 使用 jQuery UI 使可拖动元素可在可放置元素中排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20986157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com