【问题标题】:JQuery: How to drag multiple rows from one table to another?JQuery:如何将多行从一个表拖到另一个表?
【发布时间】:2014-02-16 04:41:07
【问题描述】:

这是Fiddle

我有一个表格,其中包含可多选的可拖动行,但我想将它们整体拖到另一个表格并将它们放在那里 - 不是作为附加元素附加到另一个表格,而是做一些事情信息,即表单提交。

我的示例最初基于我在这里找到的另一个演示:multi drag demo

这里是这个问题的基本示例的 HTML 代码。

<table class="DraggableThings">
  <tr draggable='true'><td >Row 1</td></tr>
  <tr draggable='true'><td >Row 2</td></tr>
  <tr draggable='true'><td >Row 3 </td></tr>
</table>

<table id='menu_table'>
  <tbody>
    <tr>
        <td class='droppableItem' >accomplished</td>
    </tr>
  </tbody>
</table>

这里是 JQuery 代码

$('.droppableItem')
   .bind('dragenter dragover', false)
   .bind('drop', function(event){
       accomplished($(this),event);
});
$('.DraggableThings tr').bind('click', function () {
   $(this).toggleClass("selected");
});
$('.DraggableThings tr').bind('dragstart', function(event){
  var mytext = event.target.innerText;
  event.originalEvent.dataTransfer.setData('txt', mytext );
});
$('.DraggableThings tr').drag("init", function () {
    return $('.selected');
  }).drag(function (ev, dd) {
    $(this).css({
        top: dd.offsetY,
        left: dd.offsetX
    });
});


function accomplished(thing,event) {
  event.dataTransfer = event.originalEvent.dataTransfer;
  var data = event.dataTransfer.getData('txt');
  log(data + " made it to accomplishments");
}

css

.selected {
  background-color: #ECB;
}

这是Fiddle

希望有人知道答案 谢谢

【问题讨论】:

  • 那么让我们照你说的去做吧——我们抓取一些行并将它们扔到放置区。它们没有被附加(所以就好像它们从未移动过),但我们可以获取被移动到那里的对象(通过 id、类等)并使用该信息。您需要从这些移动的对象中获得什么信息,表单的作用是什么?
  • 嗯,这个项目是一个“待办事项”列表类型的东西,一次向服务器提交多个成就而不是一次一个太慢会很有效。 UI 已经非常复杂,具有很多可拖动性。您目前可以将单个项目拖到具有不同功能的各种图标上,例如“删除”或“推迟”或“完成”。完成此操作后,它会将信息发回服务器并更新您的个人日历并将信息存储在您的驱动器文件夹中。等
  • 因此,一旦你知道它被丢弃在哪里,你应该做什么(或者你得到了你需要做的事情),手头的问题是弄清楚如何达到能够做到的程度将多个项目放入其中一个区域并收到类似“1、2 和 3 已完成”的消息。
  • 没错!谢谢
  • 现在正在处理它。我只需要修复消息的打印方式。

标签: jquery drag-and-drop html-table multi-select multirow


【解决方案1】:

这是一个JSFiddle 演示,但我建议修复表格行,因为拖动多行有时会使一个表格行混淆另一个表格行,因为它们没有那么大的间距,所以它无法告诉您在哪个表格行'正在尝试放置元素。为了测试,我把它们放大了。

您可以通过单击而不是拖动来确保将其添加到正确的类别中。

它与您的其他问题中的代码相同,只是我们将其切换为action(ui.helper.children(), event);,以便我们传递我们选择的元素(及其各自的文本)和事件,该事件返回表格行的内部文本(即完成、推迟和删除)。

重写的动作代码为:

function action(a,b) {
    for(var i = 0; i < a.length; i++)
        log(a[i].innerText + " made it to " + b.target.innerText);
}

我们循环发布到日志,这样我们就可以得到我们单独选择的所有元素。 b.target.innerText 获取类别(再次,即完成、推迟和删除)。不循环意味着我们得到了所有元素的连接(例如“Row1Row2”)。

【讨论】:

  • Sweet,看起来除了文本部分之外它基本上可以工作。太棒了,谢谢
  • 哪个文本部分?还是您的意思是表格行的大小太小,以至于可能被错误的表格行截获?
  • 当我运行小提琴并一次将两行拖到完成区域时,它说:“未定义使其未定义未定义使其未定义”
  • 真的吗? JSFiddle 在我这边运行良好:Screenshot
  • 好的,我刚刚在 Firefox 和 Chrome 上尝试过。它适用于 Chrome,但我在 Firefox 上得到未定义的错误
猜你喜欢
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多