根据HTML5的新方法 drag & drop 方法实现表格拖拽实例
上一次学习了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 方法实现表格拖拽实例的更多相关文章
- Win10/UWP新特性—Drag&Drop 拖出元素到其他App
在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...
- HTML5拖拽实例
最近应该会用到,借用一下......小妹儿,你又变懒了 拖拽相关属性 draggable属性是html5的全局属性,是html5支持拖放操作的方式之一,用来表示元素是否可以被拖放,draggable有 ...
- HTML5 之 FileReader 的使用 (网页上图片拖拽并且预显示可在这里学到) [转载]
转载至 : http://www.360doc.com/content/14/0214/18/1457948_352511416.shtml FileReader 资料(英文) : https://d ...
- 图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
一 . 背景及效果 当前互联网上传文件最多的就是图片文件了,但是传统web图片的截图上传需要:截图保存->选择路径->保存后再点击上传->选择路径->上传->插入. 图片 ...
- swift方法 的写法,ui上拖拽的控件到controller里面的方法
直接点xcode右上角三个按键中间一下,左右拆分为storyboard和controller, 点击button,按ctrl,然后拖拽到controller里面即可生成对应的点击事件在controll ...
- 用HTML5 File API 实现截图粘贴上传、拖拽上传
<!DOCTYPE html><html><head> <title>test chrome paste image</title> < ...
- HTML5魔法堂:全面理解Drag & Drop API
一.前言 在HTML4的时代,各前端工程师为了实现拖拽功能可说是煞费苦心,初听HTML5的DnD API觉得那些痛苦的日子将一去不复返,但事实又是怎样的呢?下面我们一起来看看DnD API的真面 ...
- HTML5 拖拽实现
简介: 最早在网页中引入JavaScript拖放功能是IE4.当时,网页中只有两种对象可以拖放:图像和某些文本.拖放图像时,把鼠标放到图像上,按住鼠标不放就可以拖放它.拖放文本时,要先选中文本,然后可 ...
- HTML5多图片拖拽上传带进度条
前言 昨天利用css2的clip属性实现了网页进度条觉得还不错,但是很多情况下,我们在那些时候用进度条呢,一般网页加载的时候如果有需要可以用,那么问题就来了,怎么才算整个加载完毕呢,是页面主要模块加载 ...
随机推荐
- 前端综合学习笔记---异步、ES6/7、Module、Promise同步 vs 异步
同步 vs 异步 先看下面的 demo,根据程序阅读起来表达的意思,应该是先打印100,1秒钟之后打印200,最后打印300.但是实际运行根本不是那么回事 console.log(100) setTi ...
- 详解MySQL数据类型
原文地址http://www.cnblogs.com/xrq730/p/5260294.html,转载请注明出处,谢谢! 前言 很久没写文章,也有博友在我的有些文章中留言,希望我可以写一些文章,公司项 ...
- sqlserver中压缩日志文件
最近在转移数据,sqlserver的日志文件ldf,占用空间特别大,为了还原库,节省空间,所以压缩日志文件迫在眉睫.在网上找了一段代码: USE [master] GO ALTER DATABASE ...
- AngularJS中实现服务端分页
这个教程将介绍在AngularJS应用中的服务端分页处理.在任何涉及到列表或表格数据的应用中都可能会用到分页. 概念 当我们处理异步分页时,每次只从服务器上获取一页数据.也就是说当用户点击第二页,就只 ...
- Java实现mongodb原生增删改查语句
Java实现mongodb原生增删改查语句 2018-03-16 自动化测试时,需校验数据库数据,为了快速自动化,在代码中用原生增删改查语句操作mongodb 结构 代码 0 pom.xml < ...
- 【转】UML的9种图例解析
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...
- c# 根据唯一码,存缓存 实现12小时内 阅读量+1
需求:某一个详细页面需要实现用户 12小时内阅读量+1, 实现思路;得到一个唯一码的机器码,不管是否用户登录了 都有这个码,然后存到缓存里面 最后判断时间+12小时 是否超过当前时间 string ...
- 转:命令passwd报错因inode节点处理记录
命令passwd报错因inode节点处理记录 原文:http://blog.sina.com.cn/s/blog_506ed9e6010106kj.html 故障现象: 1.修改密码时报错 ...
- C# Int 类型线程不安全
之前统计报表算法做了一个优化,一个查询二十分钟导致客户端超时,优化到只需要5秒钟.后来发现for循环里数据合并的时候耗时,就用并行做优化.但是发现并行后丢居然数据(当然是因为List线程不安全). 前 ...
- Tomcat服务器简单测试jsp文件和html文件
在tomcat里面的webapps文件夹下面新建一个test文件, 写一个test.html的文件,一个test.jsp的文件,两个文件的内容全是:2+2=<%=2+2%> 重新启动Tom ...