上一次學習了html5的drag和drop方法,傳送門 就自己寫了個例子加深自己對drag和drop的理解。不過一開始不是很簡單,遇到了不少問題。還好網路萬能的,什麼都能查到,總算完成了。 說明和詳解都在代碼里。 html和css代碼如下: <table> <thead> <tr> <th>年齡</ ...
上一次學習了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>View Code
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