上一次学习了html5的drag和drop方法,传送门  就自己写了个例子加深自己对drag和drop的理解。不过一开始不是很简单,遇到了不少问题。还好网络万能的,什么都能查到,总算完成了。

说明和详解都在代码里。

html和css代码如下:

<table>
<thead>
<tr>
<th>年龄</th>
<th>姓名</th>
<th>面试时间</th>
<th>面试类型</th>
<th>面试官</th>
<th>结论</th>
</tr>
</thead>
<tbody>
<tr>
<td>33</td>
<td >章三</td>
<td>2018-04-04</td>
<td>交互设计师</td>
<td>琪琪</td>
<td>待查</td>
</tr>
<tr>
<td>20</td>
<td >李四</td>
<td>2018-03-07</td>
<td>前端工程师</td>
<td>悠悠</td>
<td></td>
</tr>
<tr>
<td>24</td>
<td >王五</td>
<td>2018-04-10</td>
<td>java工程师</td>
<td>懒懒</td>
<td></td>
</tr>
<tr>
<td>18</td>
<td >六六</td>
<td>2018-03-05</td>
<td>UI设计师</td>
<td>张施</td>
<td>通过</td>
</tr>
<tr>
<td>21</td>
<td >刘灿</td>
<td>2018-04-14</td>
<td>交互设计师</td>
<td>琪琪</td>
<td>通过</td>
</tr>
<tr>
<td>28</td>
<td >李江</td>
<td>2018-03-27</td>
<td>前端工程师</td>
<td>悠悠</td>
<td></td>
</tr>
<tr>
<td>22</td>
<td >王雷</td>
<td>2018-03-30</td>
<td>java工程师</td>
<td>懒懒</td>
<td></td>
</tr>
<tr>
<td>25</td>
<td >刘哲</td>
<td>2018-03-16</td>
<td>UI设计师</td>
<td>张施</td>
<td>通过</td>
</tr>
</tbody>
</table>

javascript代码如下:

<script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js"></script>
$('thead th').attr('draggable',true); // 将表格th声明为可拖拽

    $('thead th').on('dragstart',function(ev){
// 被拖数据的数据类型和值
ev.originalEvent.dataTransfer.setData("Text", ev.currentTarget.cellIndex);
}) $('thead th').on('dragover',function(ev){
// 阻止默认行为
ev.preventDefault();
}) $('thead th').on('drop',function(ev){
// 阻止默认行为
ev.preventDefault();
// 获取被拖的数据的索引
var id = ev.originalEvent.dataTransfer.getData("Text");
// 当前要放下的索引
var Id = this.cellIndex;
// 存储点击的this
var that = this;
// 遍历th
$('thead th').each(function(){
// 获取遍历的每一个th,这个this和点击的this不一样
var _this = this;
// 当遍历的每一个th的索引和被拖拽的索引一致时,重构
if(_this.cellIndex == id){
if(id > Id){
that.before(_this);
}else{
that.after(_this);
}
}
})
// 遍历tbody的tr
$('tbody tr').each(function(i){
// 提供一个容器,分别用来存储原位置的一列和被拖拽的一列
var box1 = "";
var box2 = "";
// 遍历tr中的td
$(this).children('td').each(function(){
// 存储原位置的一列
if(this.cellIndex == Id){
box1 = this;
}
// 存储被拖拽的一列
if(this.cellIndex == id){
box2 = this;
}
})
if(id > Id){
box2.after(box1);
}else{
box2.before(box1);
}
})
})

遇到的问题:

1 setData获取不到,报错。
原因:因为是参数ev是被jquery封装的,而不是自身原生的,要获取就按 ev.originalEvent.dataTransfer.setData()。

2 不是所有的事件方法都要有ev.preventDefault();这样也会阻止本身自己写的方法。

3 在遍历tbody的td时,没有想到怎么按照顺序放置拖拽和原位置,同事解答之后,才知道需要一个容器去存储。

大家对这个实例如果有问题或者有更好的办法,请评论或私信,一起进步。

参考资料:

1 http://www.cnblogs.com/sqh17/p/8676983.html

根据HTML5的新方法 drag & drop 方法实现表格拖拽实例的更多相关文章

  1. Win10/UWP新特性—Drag&Drop 拖出元素到其他App

    在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...

  2. HTML5拖拽实例

    最近应该会用到,借用一下......小妹儿,你又变懒了 拖拽相关属性 draggable属性是html5的全局属性,是html5支持拖放操作的方式之一,用来表示元素是否可以被拖放,draggable有 ...

  3. HTML5 之 FileReader 的使用 (网页上图片拖拽并且预显示可在这里学到) [转载]

    转载至 : http://www.360doc.com/content/14/0214/18/1457948_352511416.shtml FileReader 资料(英文) : https://d ...

  4. 图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传

    一 . 背景及效果 当前互联网上传文件最多的就是图片文件了,但是传统web图片的截图上传需要:截图保存->选择路径->保存后再点击上传->选择路径->上传->插入. 图片 ...

  5. swift方法 的写法,ui上拖拽的控件到controller里面的方法

    直接点xcode右上角三个按键中间一下,左右拆分为storyboard和controller, 点击button,按ctrl,然后拖拽到controller里面即可生成对应的点击事件在controll ...

  6. 用HTML5 File API 实现截图粘贴上传、拖拽上传

    <!DOCTYPE html><html><head> <title>test chrome paste image</title> < ...

  7. HTML5魔法堂:全面理解Drag & Drop API

    一.前言    在HTML4的时代,各前端工程师为了实现拖拽功能可说是煞费苦心,初听HTML5的DnD API觉得那些痛苦的日子将一去不复返,但事实又是怎样的呢?下面我们一起来看看DnD API的真面 ...

  8. HTML5 拖拽实现

    简介: 最早在网页中引入JavaScript拖放功能是IE4.当时,网页中只有两种对象可以拖放:图像和某些文本.拖放图像时,把鼠标放到图像上,按住鼠标不放就可以拖放它.拖放文本时,要先选中文本,然后可 ...

  9. HTML5多图片拖拽上传带进度条

    前言 昨天利用css2的clip属性实现了网页进度条觉得还不错,但是很多情况下,我们在那些时候用进度条呢,一般网页加载的时候如果有需要可以用,那么问题就来了,怎么才算整个加载完毕呢,是页面主要模块加载 ...

随机推荐

  1. Delphi子窗体随主窗体大小而变化

    当然办法有很多种,我建议用TRzsplitter更好点, TRzsplitter分割,在其上边放置panel,然后把align置为alClient,则可以随着主窗体的大小而一起变动 选中此控件右键ed ...

  2. 【learning】kd-tree

    吐槽 kd-tree这个东西很早就听说过了但是qwq一直没有去了解 (原因的话..啊哈哈听说是什么跟二维平面之类的东西有关的所以就怂掉了qwq没错就是怂qwq) 但其实好像..真的很暴力啊qwq知道思 ...

  3. TypeScript入门知识一(字符串特性)

    一,TypeScript多行字符串 传统JavaScript字符串换行需要+进行拼接,而TypeScript不需要+拼接.看下面实例: javaScript: var content = " ...

  4. 2018 年 3 月 iOS架构师 面试总结

    序言: 今年2月中下旬因为个人原因,换了一份工作,3月初期间面试了有3,4家,基本都是D轮或者刚刚上市的公司,也有上榜的BAT,也从他们的面试笔试中看到了自己的一些不足,于是就想写出来和大家分享一下, ...

  5. HashMap中的resize以及死链的情况

    之前我已经写过关于HashMap的内容了:http://www.cnblogs.com/wang-meng/p/7545725.html 我们都知道HashMap是线程不安全的, 如果多线程来访问会有 ...

  6. ngrx/store effects 使用总结1:计数器

    本教程案例github:https://github.com/axel10/ngrx_demo-counter-and-list angular2+ 的学习成本应该是三大框架中最高的一个,教程及案例稀 ...

  7. python格式化输出基础知识(2)

    ---恢复内容开始--- 一:请输入名片  (姓名,年龄,职业,爱好)设计名片 name=input('你的名字')age=input('你的年龄')job=input('你的工作')hobbie=i ...

  8. mysql安装过程

      1.到官网下载Mysql,目前最新版都是5.0以上版本,下载之后直接解压即可   2.在终端进入bin目录(如果嫌麻烦可配置环境变量,配置之后则无需进入bin目录则可敲命令),安装数据库服务:my ...

  9. linux常用命令汇总(更新中...)

    文本查看与编辑 1.文本编辑命令 vi/vim 2.查看文件内容命令 命令 说明 命令格式 参数 cat 将一个文件的内容连续输出在屏幕上 cat [-option]  文件名 -n:将行号一起显示在 ...

  10. mysql-proxy实现读写分离

    其中Amoeba for MySQL也是实现读写分离 环境描述:操作系统:CentOS6.5 32位主服务器Master:192.168.179.146从服务器Slave:192.168.179.14 ...