【问题标题】:Using the HTML5 drag and drop API to create sortable table rows使用 HTML5 拖放 API 创建可排序的表格行
【发布时间】:2014-09-24 02:35:56
【问题描述】:

我已经广泛搜索了一个示例,其中有人使用 HTML5 拖放 API 来启用表格行(tr 元素)的重新排序,但那里似乎没有任何内容。我遇到了一些定位鼠标光标位置的示例,但当然这些示例并没有利用看起来非常方便的新 API 事件。

迄今为止,我真正看到的所有帖子都是使用有序列表和无序列表以及列表元素的示例。我自己的实验以类似于在列表中使用它们的方式应用 dragstart、dragover 和 drop 处理程序并没有导致任何工作。

有没有人设法将这个应用到表格元素上,他们有一个可行的例子吗?我知道 jQuery 可排序插件,但我对原生 JavaScript 解决方案特别感兴趣。

【问题讨论】:

  • 为了澄清 jQuery 不是“原生 JavaScript”,为什么它没有根据?
  • 我一直在努力让表格行可以拖放,即使你不使用 jQuery UI,也有很多使用 jQuery 更容易的东西:可排序(有效我可能会添加的表格行非常好)。您需要在没有 jQuery 的情况下进行一些非平凡的 DOM 操作和遍历,并计算每一行的确切位置(从文档顶部开始),jQuery 有一个 offset() 方法,否则您正在编写自己的,请参阅:github.com/jquery/jquery/blob/master/src/offset.js

标签: html html-table rows drag


【解决方案1】:

我花了几天时间尝试根据本教程为 React JS “从头开始”实现 HTML 5 拖放:http://webcloud.se/sortable-list-component-react-js/,它似乎工作得很好。

这是我最终得到的结果:http://jsfiddle.net/LoneIgadzra/wsj7tLw8/

不幸的是,它需要 jQuery(虽然不是 jQuery UI)来实现几个我自己编写起来很痛苦的函数,即“closest()”和“offset()”。我希望这仍然可以让您更接近一个有效的拖放重新排序表。这并不复杂,但有很多陷阱。

您需要做的就是编写自己的偏移量实现,并且最接近于移除 jQuery。 React this.state.data 的东西可以用 DOM 函数替换,以便在放置时重新定位拖动的行。

老实说,如果你能侥幸成功的话,只要 jQuery UI Sortable 就可以对表格进行非常细微的调整。 HTML 5 拖放是一个糟糕的 API,而且兼容性较差。这是我放弃支持 React 的工作 jQuery UI 解决方案:

jQuery(function($) {
  $('table.sortable').sortable({
    items: ".item",
    axis: "y",
    stop: function(event, ui) {
      ui.item.effect('highlight');
    },
    update: function(event, ui) {
      // update server here
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script>
<table class="sortable">
  <tr>
    <th>Header 1</th>
    <th>Header 2</th>
  </tr>
  <tr class="item">
    <td>Cell 1</td>
    <td>Cell 2</td>
  </tr>
  <tr class="item">
    <td>Cell 1</td>
    <td>Cell 2</td>
  </tr>
  <tr class="item">
    <td>Cell 1</td>
    <td>Cell 2</td>
  </tr>
</table>

【讨论】:

  • 提问者特别说“不是jquery”。
  • 当然,我的解决方案是一个指向 React 教程的链接以及如何修复它以使用表的说明,并且我已经更改了措辞以澄清。我的印象是,真正的问题是让表格行拖放,并且没有很好的教程。如果您使用无序列表教程,它可能不会起作用。
  • 我会尽量让它通用。
  • 我喜欢这种方法,但是如果表格行大小是动态的呢?
  • 没关系。它只会计算行高。我不知道为什么 jsfiddle 现在坏了。 :(
猜你喜欢
  • 1970-01-01
  • 2010-09-10
  • 2019-04-18
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
相关资源
最近更新 更多