`
mutongwu
  • 浏览: 452577 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

构建可拖拽table

阅读更多
<style type="text/css">
table{
	border-collapse:collapse;
	width:300px;
}
table caption{
	border-right:1px solid #abc;
	border-left:1px solid #abc;
	border-top:2px solid #000;
	border-bottom:2px solid #000;
	background-color:#afd;
}
#sales tr,#sales td{
	border:1px solid #abc;
	text-align:center;
}
</style>

<table id="sales" summary="summary here">
	<caption>Main Title</caption>
		<col/>
		<col/>
		<col/>
	<thead>
		<tr><th class="asc">Col1</th><th>Col2</th><th>Col3</th></tr>
	</thead>
	<tbody>
		<tr><td>A1</td><td>S2</td><td>W3</td></tr>
		<tr><td>B1</td><td>C2</td><td>V3</td></tr>
		<tr><td>C1</td><td>X2</td><td>K3</td></tr>
	</tbody>
</table>
<button onclick="drag()">Drag</button>

function drag(){
    var sortTable = new ColumnDrag('sales');
}
function ColumnDrag(id) {
    this.tbl = document.getElementById(id);
    if (this.tbl && this.tbl.nodeName == "TABLE") {
        this.state = null;
        this.prevX = null;
        this.cols = this.tbl.getElementsByTagName("col");
        this.makeDraggable();
    }
}

ColumnDrag.prototype.makeDraggable = function () {
    // Add trailing text node for IE
    for (var i=0; this.tbl.rows[i]; i++) {
        var td = document.createElement("td");
            td.style.display = "none";
        this.tbl.rows[i].appendChild(td);
    }
    
    // Wire up headings
    var headings = this.tbl.tHead.rows[0].cells;
    for (var i=0; headings[i]; i++) {
        headings[i].cIdx = i; 
        
        var a = document.createElement("a");
            a.href = "#";
            a.innerHTML = "&larr; " + headings[i].innerHTML + " &rarr;";
            a.onclick = function () {
                return false;
            }
            
        headings[i].className += " draggable";
        headings[i].onmousedown = function (that) {
            return function (e) {
                that.mousedown(e);
                return false;
            }
        }(this);
        document.onmousemove = function (that) {
            return function (e) {
                that.mousemove(e);
                return false;
            }
        }(this);
        document.onmouseup = function (that) {
            return function () {
                var e = that.clearAllHeadings();
                if (e) that.mouseup(e);
            }
        }(this);

        headings[i].innerHTML = "";
        headings[i].appendChild(a);

    }
}

ColumnDrag.prototype.clearAllHeadings = function (){
    var e = false;
    for (var i=0; this.cols[i]; i++) {
        var th = this.tbl.tHead.rows[0].cells[i];
        if (th.className.match(/down/)) {
            e = {target: th};
        }
    }
    return e;
}

ColumnDrag.prototype.mousedown = function (e) {
    e = e ? e : window.event;
    var elm = e.target? e.target : e.srcElement;
    elm = elm.nodeName == "A" ? elm.parentNode : elm;
    
    this.state = "drag";
    elm.className += " down";
    this.cols[elm.cIdx].className = "drag";
    this.from = elm;
}

ColumnDrag.prototype.mousemove = function (e) {
    e = e ? e : window.event;
    var x = e.clientX ? e.clientX : e.pageX;
    var elm = e.target? e.target : e.srcElement;

    if (this.state == "drag" && elm != this.from) {
        var from = this.from.cIdx;
        var to = elm.cIdx;
        
        if ((from > to && x < this.prevX) || (from < to && x > this.prevX)) {
            
            // highlight column
            this.cols[from].className = "";
            this.cols[to].className = "drag";

            if (from < to) to++;
            
            // shift all cells belonging to head
            var rows = this.tbl.rows;
            for (var i=0; rows[i]; i++) {
                rows[i].insertBefore(rows[i].cells[from], rows[i].cells[to]);
            }
            
        }
    }
    this.prevX = x;
}
ColumnDrag.prototype.mouseup = function (e) {
   
    e = e ? e : window.event;
    var elm = e.target? e.target : e.srcElement;
    elm = elm.nodeName == "A" ? elm.parentNode : elm;

    this.state = null;
    var col = this.cols[elm.cIdx];
    col.className = "dropped";
     return;
}



整理自《The Art & Science of Javascript》
分享到:
评论

相关推荐

    拖动table单元格改变列宽或行高

    本文将深入探讨如何实现“拖动table单元格改变列宽或行高”的功能,以及这一特性在表格设计器中的应用。 首先,我们要理解HTML表格的基本结构。一个HTML表格由`&lt;table&gt;`元素定义,包含多个`&lt;tr&gt;`(行)元素,每个`...

    vue Element ui实现table列拖动效果

    handle: '.el-table__column-header-wrapper', // 指定可拖动的元素 onEnd: this.handleColumnDragEnd, // 拖动结束事件 }); }, methods: { handleColumnDragEnd({ oldIndex, newIndex }) { // 使用Sortable...

    bootstraptable-reorder-columns表格拖拽排序列

    BootstrapTable 是一个流行的开源前端组件库,用于创建交互式、响应式的HTML表格。"bootstraptable-reorder-columns" 是...通过理解和熟练运用这个插件,开发者可以构建出更符合用户需求的、高度可定制的数据展示界面。

    jQueryUI拖拽效果_拖拽div的值到table表格里面

    当拖动的元素进入、离开或被放置到可放置区域时,会触发相应的事件。例如: ```javascript $('.table tbody').droppable({ accept: '.draggable-div', // 只接受特定类别的div drop: function(event, ui) { var...

    可调整列宽TABLE

    在网页设计中,"可调整列宽TABLE"是一种常见的交互式数据展示技术,它使得用户可以根据需要自由调整表格中列的宽度。这种功能通常应用于数据量大、信息丰富的表格,以便用户能更清晰地查看和理解数据。下面将详细...

    自由拖动table

    在IT行业中,"自由拖动table"通常是指在网页或应用程序中实现表格元素的可拖动功能,允许用户通过鼠标或其他交互方式自由调整表格的位置或大小。这种功能常见于数据管理、项目管理以及各种定制化界面中,为用户提供...

    基于Vue.js的可拖拽树组件

    **基于Vue.js的可拖拽树组件** 在前端开发中,常常需要实现各种交互式的UI组件,其中树形结构是一种常见的数据展示方式。Vue.js,作为一款轻量级且功能强大的JavaScript框架,提供了丰富的插件和组件库来帮助开发者...

    可固定TABLE表格的首行与首列,可拖动查看更多内容

    标题中的“可固定TABLE表格的首行与首列,可拖动查看更多内容”是指在网页设计中,使用HTML的表格(TABLE)元素时,通过CSS和JavaScript技术实现的一种交互功能。这种功能允许用户在滚动表格内容时,表格的表头...

    bootstrapTable-model模态框可拖动代码.zip

    在本示例中,“bootstrapTable-model模态框可拖动代码.zip”包含了一个实现BootstrapTable模态框可拖动功能的代码示例。 BootstrapTable的模态框(Modal)是通过HTML、CSS和JavaScript构建的,它提供了一种优雅的...

    vxe-table vue table 表格组件功能

    总结来说,vxe-table是一个功能全面、性能优异的Vue表格组件,它将复杂的表格操作和功能简化,使得开发者可以快速构建具有专业水平的表格界面。不管是基础的数据展示,还是复杂的交互和数据处理,vxe-table都能够...

    vxe-table vue表格解决方案 v2.11.0.zip

    深入理解vxe-table的源码有助于开发者提升自身技术水平,学习到如何优化DOM操作、如何处理复杂状态管理以及如何构建高效的数据流等高级技巧。 总之,vxe-table作为一款全面的Vue表格解决方案,无论是在功能完备性...

    bootstraptable-reorder.zip

    开发者会结合BootstrapTable的API和jquery-ui的拖放插件,使表格的列头成为可拖动的对象。以下是一些关键知识点: 1. **jQuery**:jQuery是一个快速、简洁的JavaScript库,它简化了HTML文档遍历、事件处理、动画...

    boostrap table附带各国语言

    通过这样的方式,我们可以轻松地构建一个具有中文界面的、功能齐全的Bootstrap Table。开发者可以根据实际需求调整配置,利用提供的API和事件来实现更复杂的交互和功能。同时,由于其轻量级和灵活性,Bootstrap ...

    html种table_td 列宽左右可拉伸_搜索条件可展开隐藏demo.rar

    HTML中的表格(`&lt;table&gt;`)是用于展示结构化数据的标准元素,而在这个"html种table_td 列宽左右可拉伸_搜索条件可展开隐藏demo"中,开发者分享了一个功能丰富的示例,实现了表格列宽的动态调整以及搜索条件的展开与...

    table 左右,上下拖动,来改变表的大小 类似于导航的拖动

    "table 左右,上下拖动,来改变表的大小 类似于导航的拖动"这一功能,是提高用户交互性的优秀实践,它使得用户可以根据需要自定义表格的显示范围,从而更好地查看和操作数据。这种功能在很多数据密集型应用中非常...

    react-rsuitetable是一个React实现的表格Table组件

    2. **自定义调整列宽**:`rsuite-table` 提供了灵活的列宽调整功能,用户可以通过拖动列边框来改变列的宽度。这在需要根据内容调整列宽或者提供用户自定义视图时非常实用。 3. **自定义单元格内容**:`rsuite-table...

    table内容随便移动

    在IT行业中,尤其是在网页开发和前端交互...通过以上步骤,我们可以构建一个交互性强、用户友好的表格拖动功能。在实际开发中,还需要考虑到浏览器兼容性、性能优化以及用户体验等多个方面,确保功能的稳定性和易用性。

    react-BaseTable是一个react表格组件能够以高性能和灵活性的显示大型数据集

    综上所述,React-BaseTable是React开发中的一个强大工具,特别是在构建数据密集型应用时。其高效、灵活和可定制的特性使得它成为处理大型数据集的理想选择。对于那些寻求提升表格组件性能和用户体验的开发者来说,...

    vue-easytable-master.zip_Table_easytable_easytable vue_nuxt vue-

    这个项目,"vue-easytable-master.zip",包含了完整的源代码和配置,可以帮助开发者快速集成到他们的Vue项目中,尤其是那些基于Nuxt.js构建的项目。Vue EasyTable以其丰富的功能和易用性,在Vue社区中受到了广泛的...

    Android 自定义可上下左右滑动table

    在Android开发中,自定义视图是提升用户体验和实现独特设计的重要手段。标题"Android 自定义可上下左右滑动table...如果你需要构建一个可自由滑动且具有高度自定义性的表格,这个控件的源码将是一个很好的学习资源。

Global site tag (gtag.js) - Google Analytics