jQuery - 在可排序列表中操作删除的元素

Posted

技术标签:

【中文标题】jQuery - 在可排序列表中操作删除的元素【英文标题】:jQuery - manipulate dropped element in sortable list 【发布时间】:2011-01-06 22:20:32 【问题描述】:

我有一个可拖动列表 (.field),您可以将其中的项目拖放到可排序列表 (.sortlist) 中。我这样做是因为我不希望以任何方式更改主列表(.field)。它工作正常,但我无法弄清楚如何在可排序列表中操作已删除的字段。

我可以通过在 droppable() 中的 'drop:' 函数中使用以下内容,从可拖动区域到可放置区域:

$(this).append('html code here to change content of dragged field');

但是这在 sortable() 中不起作用。我的代码如下所示:

$(".sortlist").sortable(
  receive: function(event, ui) 
    var dropElemTxt = $(ui.item).text();
    var dropElemId = $(ui.item).attr('id');
    $(ui.item).replaceWith('<li class="box" id="'+dropElemId+'">Updated field! '+dropElemTxt+'</li>');
  
);

$(ui.item).replaceWith 更改了被拖动的主字段,因此这不起作用。我尝试了 $(this).replaceWith,但这会更新可排序区域 (.sortlist)。

知道我需要什么代码来引用拖动的项目吗?

非常感谢, 阿里。

【问题讨论】:

【参考方案1】:

您可以在 beforeStop 事件中获取拖动的项目:

beforeStop: function (event, ui)  draggedItem = ui.item;,
receive: function (event, ui)  /* use draggedItem here*/ 

使用 beforeStop 事件而不是 receive 对我来说已经足够了:

beforeStop: function(event, ui)  
        var myClassItem = $('.myClass', ui.item);
        myClassItem.bind('click', function() /*my function*/ );
    

【讨论】:

这也对我有用,谢谢。我知道已知的错误(在下面的帖子中提到),但它仍然让我头疼。通过在 beforeStop 事件中设置项目,我不必在接收事件中弄乱项目,从而完全避免了该错误。【参考方案2】:

我想我已经解决了。有点hacky,但似乎工作!

我需要使用 $('.sortlist li:last') 来访问被拖动的元素...

【讨论】:

【参考方案3】:

我遵循了您的思路,但是使用这种方法存在一些错误(有时被丢弃的元素在使用 droppable + sortable 时会消失)。以下是对我有用的东西:

$(".draglist").draggable(
  start: function(e, ui) 
    draggedItem = ui.item;
  
);

$(".sortlist").sortable(
  receive: function(event, ui) 
    //do something with the 'draggedItem' here...
    var droppedElemTxt = draggedItem.text();
    var droppedElemId = draggedItem.attr('id');
  
  , start: function(e, ui) 
    draggedItem = ui.item;
  
);

【讨论】:

【参考方案4】:

无法访问被删除的元素是known bug in JQuery ui sortables. 该票包含一个允许您访问被删除元素的补丁,预计将在下一个主要版本中修复。

【讨论】:

几年后【参考方案5】:

我想我实际上想出了一个更好的解决方案......到目前为止似乎工作......

我将 droppable 附加到 sortable 以声明拖动项目的全局 var。有点像:

$(".sortlist").droppable(
  drop: function(e, ui) 
    draggedItem = ui.draggable;
  
).sortable(
  receive: function(event, ui) 
    //do something with the 'draggedItem' here...
    var droppedElemTxt = draggedItem.text();
    var droppedElemId = draggedItem.attr('id');
  
);

【讨论】:

以上是关于jQuery - 在可排序列表中操作删除的元素的主要内容,如果未能解决你的问题,请参考以下文章

Jquery ui - 可排序:在可排序元素中按图标“句柄”拖动

如何在可排序列表中排除元素被拖动?

防止在可排序的 JqueryUI 中删除列表项

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

Jquery可排序水平列表不适用于固定项目

jquery 可拖动 + 可在放置事件时使用自定义 html 排序?