`

Table Drag and Drop JQuery plugin-Table行拖拽

 
阅读更多
网址:http://www.isocra.com/2007/07/dragging-and-dropping-table-rows-in-javascript/

I’ve been using JQuery for a while now and really agree with its tag line that it’s the “The Write Less, Do More, JavaScript Library”. We’ve also got this code for dragging and dropping table rows that has proved very popular, so it seemed natural to combine the two and wrap up the table drag and drop as a JQuery plugin.
Why have another plugin?

Dragging and dropping rows within a table can’t be handled by general purpose drag and drop utilities for a number of reasons, not least because you need to move the whole row, not just the cell that receives the mouse events. Re-parenting the row also requires specific code. Sadly also, effects like fadeIn and fadeOut don’t work well with table rows on all browsers, so we have to go for simpler effects.
What does it do?

This TableDnD plugin allows the user to reorder rows within a table, for example if they represent an ordered list (tasks by priority for example). Individual rows can be marked as non-draggable and/or non-droppable (so other rows can’t be dropped onto them). Rows can have as many cells as necessary and the cells can contain form elements.
How do I use it?

   1. Download Download jQuery (version 1.2 or above), then the TableDnD plugin (current version 0.5).
   2. Reference both scripts in your HTML page in the normal way.
   3. In true jQuery style, the typical way to initialise the tabes is in the $(document).ready function. Use a selector to select your table and then call tableDnD(). You can optionally specify a set of properties (described below).

1 One some text
2 Two some text
3 Three some text
4 Four some text
5 Five some text
6 Six some text

The HTML for the table is very straight forward (no Javascript, pure HTML):

<table id="table-1" cellspacing="0" cellpadding="2">
    <tr id="1"><td>1</td><td>One</td><td>some text</td></tr>
    <tr id="2"><td>2</td><td>Two</td><td>some text</td></tr>
    <tr id="3"><td>3</td><td>Three</td><td>some text</td></tr>
    <tr id="4"><td>4</td><td>Four</td><td>some text</td></tr>
    <tr id="5"><td>5</td><td>Five</td><td>some text</td></tr>
    <tr id="6"><td>6</td><td>Six</td><td>some text</td></tr>
</table>

To add in the “draggability” all we need to do is add a line to the $(document).ready(...) function
as follows:

<script type="text/javascript">
$(document).ready(function() {
    // Initialise the table
    $("#table-1").tableDnD();
});
</script>

In the example above we’re not setting any parameters at all so we get the default settings. There are a number
of parameters you can set in order to control the look and feel of the table and also to add custom behaviour
on drag or on drop. The parameters are specified as a map in the usual way and are described below:

onDragStyle
    This is the style that is assigned to the row during drag. There are limitations to the styles that can be
    associated with a row (such as you can’t assign a border—well you can, but it won’t be
    displayed). (So instead consider using onDragClass.) The CSS style to apply is specified as
    a map (as used in the jQuery css(...) function).
onDropStyle
    This is the style that is assigned to the row when it is dropped. As for onDragStyle, there are limitations
    to what you can do. Also this replaces the original style, so again consider using onDragClass which
    is simply added and then removed on drop.
onDragClass
    This class is added for the duration of the drag and then removed when the row is dropped. It is more
    flexible than using onDragStyle since it can be inherited by the row cells and other content. The default
    is class is tDnD_whileDrag. So to use the default, simply customise this CSS class in your
    stylesheet.
onDrop
    Pass a function that will be called when the row is dropped. The function takes 2 parameters: the table
    and the row that was dropped. You can work out the new order of the rows by using
    table.tBodies[0].rows.
onDragStart
    Pass a function that will be called when the user starts dragging. The function takes 2 parameters: the
    table and the row which the user has started to drag.
scrollAmount
    This is the number of pixels to scroll if the user moves the mouse cursor to the top or bottom of the
    window. The page should automatically scroll up or down as appropriate (tested in IE6, IE7, Safari, FF2,
    FF3 beta)

This second table has has an onDrop function applied as well as an onDragClass. The javascript to set this up is
as follows:

$(document).ready(function() {

// Initialise the first table (as before)
$("#table-1").tableDnD();

// Make a nice striped effect on the table
$("#table-2 tr:even').addClass('alt')");

// Initialise the second table specifying a dragClass and an onDrop function that will display an alert
$("#table-2").tableDnD({
    onDragClass: "myDragClass",
    onDrop: function(table, row) {
            var rows = table.tBodies[0].rows;
            var debugStr = "Row dropped was "+row.id+". New order: ";
            for (var i=0; i<rows.length; i++) {
                debugStr += rows[i].id+" ";
            }
        $(#debugArea).html(debugStr);
    },
onDragStart: function(table, row) {
$(#debugArea).html("Started dragging row "+row.id);
}
});
});

Row dropped was 2.1. New order: 2.2 2.1 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14
2 Two
1 One
3 Three
4 Four
5 Five
6 Six
7 Seven
8 Eight
9 Nine
10 Ten
11 Eleven
12 Twelve
13 Thirteen
14 Fourteen
What to do afterwards?

Generally once the user has dropped a row, you need to inform the server of the new order. To do this, we’ve
added a method called serialise(). It takes no parameters but knows the current table from the
context. The method returns a string of the form tableId[]=rowId1&tableId[]=rowId2&tableId[]=rowId3...
You can then use this as part of an Ajax load.

This third table demonstrates calling the serialise function inside onDrop (as shown below). It also
demonstrates the “nodrop” class on row 3 and “nodrag” class on row 5, so you can’t pick up row 5 and
you can’t drop any row on row 3 (but you can drag it).

    $('#table-3').tableDnD({
        onDrop: function(table, row) {
            alert($.tableDnD.serialize());
        }
    });

Ajax result

Drag and drop in this table to test out serialise and using JQuery.load()
1 One
2 Two
3 Three (Can’t drop on this row)
4 Four
5 Five (Can’t drag this row)
6 Six

This table has multiple TBODYs. The functionality isn’t quite working properly. You can only drag the rows inside their
own TBODY, you can’t drag them outside it. Now this might or might not be what you want, but unfortunately if you then drop a row outside its TBODY you get a Javascript error because inserting after a sibling doesn’t work. This will be fixed in the next version. The header rows all have the classes “nodrop” and “nodrag” so that they can’t be dragged or dropped on.
H1 H2 H3
4.1 One
4.2 Two
4.3 Three
4.4 Four
4.5 Five
4.6 Six
H1 H2 H3
5.1 One
5.2 Two
5.3 Three
5.4 Four
5.5 Five
5.6 Six
H1 H2 H3
6.1 One
6.2 Two
6.3 Three
6.4 Four
6.5 Five
6.6 Six

The following table demonstrates the use of the default regular expression. The rows have IDs of the
form table5-row-1, table5-row-2, etc., but the regular expression is /[^\-]*$/ (this is the same
as used in the NestedSortable plugin for consistency).
This removes everything before and including the last hyphen, so the serialised string just has 1, 2, 3 etc.
You can replace the regular expression by setting the serializeRegexp option, you can also just set it
to null to stop this behaviour.

    $('#table-5').tableDnD({
        onDrop: function(table, row) {
            alert($('#table-5').tableDnDSerialize());
        },
        dragHandle: "dragHandle"
    });

  1 One some text
  2 Two some text
  3 Three some text
  4 Four some text
  5 Five some text
  6 Six some text

In fact you will notice that I have also set the dragHandle on this table. This has two effects: firstly only
the cell with the drag handle class is draggable and secondly it doesn’t automatically add the cursor: move
style to the row (or the drag handle cell), so you are responsible for setting up the style as you see fit.

Here I’ve actually added an extra effect which adds a background image to the first cell in the row whenever
you enter it using the jQuery hover function as follows:

    $("#table-5 tr").hover(function() {
          $(this.cells[0]).addClass('showDragHandle');
    }, function() {
          $(this.cells[0]).removeClass('showDragHandle');
    });

This provides a better visualisation of what you can do to the row and where you need to go to drag it (I hope).
Version History
0.2 2008-02-20 First public release
0.3 2008-02-27 Added onDragStart option
Made the scroll amount configurable (default is 5 as before)
0.4 2008-03-28 Fixed the scrollAmount so that if you set this to zero then it switches off this functionality
Fixed the auto-scrolling in IE6 thanks to Phil
Changed the NoDrop attribute to the class “nodrop” (so any row with this class won’t allow dropping)
Changed the NoDrag attribute to the class “nodrag” (so any row with this class can’t be dragged)
Added support for multiple TBODYs–though it’s still not perfect
Added onAllowDrop to allow the developer to customise this behaviour
Added a serialize() method to return the order of the rows in a form suitable for POSTing back to the server
0.5 2008-07-11 Now supports having a column as a drag handle (specify a class for the dragHandle option when configuring).

Improved the serialize method to use a default (but also settable in the options) regular expression for generating the serialized string. The default is /[^\-]*$/ which will remove everything before a final hyphen, so item-s1 becomes s1.

Added $(‘…’).tableDnDUpdate() to cause the table to update its rows so the drag and drop functionality works if, for example, you’ve added a row.

Added $(‘…’).tableDnDSerialize() which allows you to serialize a table from any javascript code.

Removed remaining $ and replaced with jQuery so that it should work with Prototype and Scriptaculous
分享到:
评论

相关推荐

    表格拖拽排序插件 Table Drag and Drop JQuery plugin v0.7

    表格拖拽排序插件 Table Drag and Drop JQuery plugin v0.7 最新0.7版本

    JQuery-tableDnD 拖拽的基本使用 Table Drag and Drop JQuery plugin

    在压缩包中的`Drag-Drop-Table-Plugin-with-jQuery-TableDnD`文件夹中,包含了完整的示例代码,包括HTML、CSS和JavaScript,供你参考和学习。 总之,jQuery TableDnD是一个强大且易于使用的插件,能帮助开发者轻松...

    drag-drop-folder-tree(功能强大的动态树)

    在"drag-drop-folder-tree"中,用户可以选择一个节点,然后将其拖动到树的其他部分,以改变节点的父节点关系,实现节点在树中的移动。这种功能在文件管理或项目管理等场景中尤其有用。 右键点击菜单是另一种增强...

    drag-drop-folder-tree.rar_Tree 菜单_drag drop java_drag-drop-fold

    在这个特定的实现中,"drag-drop"功能被集成到树形菜单中,使得用户能够通过拖动节点来重新组织或移动数据,这极大地提升了用户体验和操作效率。 "drag drop java"是Java编程语言中的一个特性,Java提供了Swing和...

    前端项目-angular-drag-and-drop-lists.zip

    前端项目-angular-drag-and-drop-lists,Angular directives for sorting nested lists using the HTML5 Drag and Drop API

    基于HTML5 拖拽接口(Drag and drag-and-drop interfaces based on HTML5

    HTML5是现代网页开发的重要标准,它引入了许多新特性,其中拖放(Drag and Drop)功能就是一项增强用户交互体验的重要接口。拖放接口允许用户通过鼠标或触控设备将元素从一个位置拖动到另一个位置,使得网页的互动性...

    The Drag and Drop Component Suite for Delphi XE10

    对于Delphi开发者来说,"The Drag and Drop Component Suite for Delphi XE10"是一款非常实用的工具,它极大地简化了在Delphi XE10环境下实现拖放功能的复杂度。 该组件套件是基于先前版本XE7的修改版,经过优化后...

    module-drag-drop-sort-delete.html

    module-drag-drop-sort-delete.html

    drag-drop-folder-tree.rar

    1. **HTML5 Drag and Drop API**: 这是实现拖放功能的基础,它允许开发者创建可拖动元素,并定义它们在何处可以被放置。HTML5中的`draggable`属性设置为`true`,即可使元素具有拖放功能。同时,通过监听`dragstart`...

    Beautiful-and-Accessible-Drag-and-Drop-with-react-beautiful-dnd-notes

    # Beautiful-and-Accessible-Drag-and-Drop-with-react-beautiful-dnd-notes 讲师 描述 拖放 (dnd) 体验通常用于对内容列表进行垂直和水平排序。 react-beautiful-dnd 是这些用例的绝佳工具。 它利用渲染道具模式...

    Android中Drag and Drop拖拽功能的使用

    在Android开发中,拖放(Drag and Drop)功能是一种常见的用户交互方式,允许用户通过手势将一个对象从一处移动到另一处。这个功能在许多场景下都非常实用,比如整理应用抽屉、移动文件或者在布局中调整控件位置等。...

    Java中的Drag and Drop拖拽技术

    "Java中的Drag and Drop拖拽技术" Java中的Drag and Drop拖拽技术是指在Java应用程序中,实现拖拽操作的技术。Drag and Drop技术可以将数据从一个组件拖拽到另一个组件中,实现数据的传输和交互操作。 Drag and ...

    The Drag and Drop Component Suite 5.8 for Delphi

    This version of the library has been tested with Delphi 6, Delphi 7, Delphi 2007, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, Delphi XE...

    js动态树合集(dtree,dhtmlxtree,drag-drop-tree)

    drag-drop-tree 是一个专门针对拖放功能的JavaScript库,允许用户通过拖拽操作来重新排列树的结构。这种库对于需要高度用户交互的应用非常有用,比如文件管理器或者任务管理器。拖放功能的实现涉及到HTML5的drag ...

    drag-drop-folder-tree.zip_ajax_dhtmlxtree dr_drop_tree_tree ja

    在这个特定的例子"drag-drop-folder-tree.zip_ajax_dhtmlxtree_dr_drop_tree_tree_ja"中,开发者利用JavaScript的特性实现了一个拖放功能,这在AJAX(Asynchronous JavaScript and XML)开发中非常常见。AJAX允许...

    掌握JavaScript中的Drag and Drop API:交互式Web应用开发指南

    本文将详细介绍Drag and Drop API的基本概念、事件处理、以及如何在JavaScript中使用这个API来实现拖拽功能。 Drag and Drop API为Web应用带来了强大的交互性。通过本文的介绍和示例代码,开发者应该能够理解并实现...

    Android简单的拖拽操作(DragAndDrop)

    在Android开发中,拖放(DragAndDrop)功能是一个常用且有趣的交互方式,它允许用户通过手势将一个视图移动到另一个位置,或者在不同的视图之间传递数据。本示例将详细介绍如何实现一个简单的拖放操作,并解决你在...

    jquery.dragtable.js

    bootstrap-table拖拽需要dragtable.css,jquery.dragtable.js,jquery-ui.js,bootstrap-table-reorder-columns.js

    DragAndDrop Gestures Mini-crx插件

    在使用DragAndDrop Gestures Mini-crx时,用户只需在支持的网页上找到想要下载的图片链接,然后执行预设的手势,通常是按住鼠标左键拖动图片链接到特定区域或直接拖放到桌面,即可触发下载。这种直观的交互方式降低...

Global site tag (gtag.js) - Google Analytics