上一次學習了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
