jQuery可拖动的表元素

时间:2008-11-21 04:39:29

标签: jquery css drag-and-drop html-table

jQuery的draggable功能似乎不适用于表格(在FF3或Safari中)。很难想象这个如何工作,所以它并不令人惊讶。

<html>
  <style type='text/css'>
    div.table { display: table; }
    div.row { display: table-row; }
    div.cell { display: table-cell; }
  </style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script src="http://dev.jquery.com/view/tags/ui/latest/ui/ui.core.js"></script>
  <script src="http://dev.jquery.com/view/tags/ui/latest/ui/ui.draggable.js"></script>
  <script>
  $(document).ready(function(){
    $(".row").draggable();
  });
  </script>
  <body>
    <div class='table'>
      <div class='row'>
        <div class='cell'>Foo</div>
        <div class='cell'>Bar</div>
      </div>
      <div class='row'>
        <div class='cell'>Spam</div>
        <div class='cell'>Eggs</div>
      </div>
    </div>
    <table>
      <tr class'row'><td>Foo</td><td>Bar</td></tr>
      <tr class='row'><td>Spam</td><td>Eggs</td></tr>
    </table>
  </body>
</html>

我想知道a)是否有任何具体原因导致这不起作用(从w3c / HTML规范角度来看)和b)获取可拖动表格行的正确方法是什么。

我喜欢真正的桌子,因为边框折叠和行高算法 - 任何可以做这些事情的替代方案都可以正常工作。

6 个答案:

答案 0 :(得分:35)

有一种方法可以使用JQuery UI使表行可拖动。 你需要做的就是将一个helper选项设置为一个函数,该函数返回一个新的div,里面有一个表,它将托管你拖动的行:

helper: function(event){
return $('<div class="drag-cart-item"><table></table></div>').find('table').append($(event.target).closest('tr').clone()).end();
},

向David Petersen致谢:http://blog.petersendidit.com/post/drag-table-row-to-a-div-with-jquery/

答案 1 :(得分:22)

如果你有真正的表格数据,你应该坚持使用表格。

如果你想在表格中拖动行,这个 JQuery + "draggable row table" library 在FireFox3中完美运作

答案 2 :(得分:11)

以防万一我犯了同样的错误:

如果你想通过拖动它们来重新排序表中的TR,那么.sortable就是你需要的而不是.draggable

只是我?

答案 3 :(得分:3)

这有点晚了,但今天我发现 html5 drag'n drop API 可以正常使用<tr>元素。您需要做的就是启用它<tr draggable="true">并注册事件

dragstart
drag
dragenter
dragleave
dragover
drop
dragend

我发现这篇文章非常有用http://www.html5rocks.com/en/tutorials/dnd/basics/

!!请注意,此html5 API存在一个缺陷,即使您只对父元素感兴趣,当您将鼠标悬停在子元素上时也会触发该事件。希望html5rocks人们很快就能解决它。

答案 4 :(得分:1)

我使用JqueryUI进行了以下工作:

$(function() {
  $(".sortable").sortable({
    revert: true
  });
});
table td {
  border: solid 1px black;
}
table {
  border-collapse: collapse;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<table>
  <tbody class="sortable">
    <tr>
      <td>1</td>
      <td>One</td>
      <td>some text</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Two</td>
      <td>some text</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Three</td>
      <td>some text</td>
    </tr>
    <tr>
      <td>4</td>
      <td>Four</td>
      <td>some text</td>
    </tr>
    <tr>
      <td>5</td>
      <td>Five</td>
      <td>some text</td>
    </tr>
    <tr>
      <td>6</td>
      <td>Six</td>
      <td>some text</td>
    </tr>
  </tbody>
</table>

答案 5 :(得分:0)

也可以设置css tr.ui-draggable-dragging {display: block} - 这样可以拖动行,但是,它们的坐标计算不周。我还没有找到解决这个问题的好方法。