歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 使用HTML5的drag&drop做一個數獨游戲

使用HTML5的drag&drop做一個數獨游戲

日期:2017/3/1 10:26:23   编辑:Linux編程

數獨是很好玩的游戲,之前我用jQuery做了一個數獨游戲,因為用javaScript來實現drag和drap非常麻煩,jQuery的UI提供了一套非常不錯的drag和drap(以後就簡稱DnD算了),方便我們開發。現在HTML5支持原生的DnD了,那我們來學習下,並且將原先的數獨游戲遷移到HTML5的DnD應用來。




先簡單的了解下HTML5的DnD事件模型,事件發生在源元素(被拖動的元素)和目標元素(被進入的元素)上,為了簡單的描述,我們將源元素稱為src,目標元素叫des。

drag:src[拖動中] dragstart:src[開始拖動] dragenter:des[進入目標] dragover:des[在目標移動] dragleave:des[離開目標] drop:des[釋放拖動] dragend:src[拖動完成]所有的事件我們知道肯定都應該給我們一個event對象,幫助我們獲得一些信息或我們來設置一些信息,以上事件都可以得到一個event,如果我們的事件函數是function(e)那

e.dataTransfer.effectAllowed,只能在dragstart事件設置,值為以下之一:"none", "copy", "copyLink", "copyMove", "link", "linkMove", "move", "all", and "uninitialized"

e.dataTransfer.dropEffect,返回拖來的行為,對應上面的effectAllowed,值是:"none", "copy", "link", and "move"

e.target,可以得到當前事件的dom對象,比如你可以得到e.target.innerHTML,或者設置e.target.classList.add,或者e.target.classList.remove

e.dataTransfer.setData(foramt,value),為拖動賦值,foramt的值是為了描述值的類型,一般有text/plain 和 text/uri-list

e.dataTransfer.getData(foramt),獲取被拖來的元素通過setData存儲的值

e.stopPropagation,阻止事件冒泡,這樣可以防止子元素的拖動處理被帶到父元素事件中(觸發父元素事件),在IE中可以用e.cancelBubble = true

e.preventDefault,阻止默認事件發生,也可以簡單的寫return false,在IE中可以用e.returnValue = false

有了上面的基本概念,我們先做一個小小的模型,來測試幾個技術要點:監視拖放事件,改變元素在拖放中的樣式,傳遞值和檢查值什麼的

在body裡面,我們聲明了10個div元素,並且都標記允許拖放

  1. <body>
  2. <div style="width: 50px; height: 50px; background-color: Red;" draggable="true">
  3. 1
  4. </div>
  5. <div style="width: 50px; height: 50px; background-color: Yellow;" draggable="true">
  6. 2
  7. </div>
  8. <div style="width: 50px; height: 50px; background-color: Blue;" draggable="true">
  9. 3
  10. </div>
  11. <div style="width: 50px; height: 50px; background-color: Lime;" draggable="true">
  12. 4
  13. </div>
  14. <div style="width: 50px; height: 50px; background-color: Maroon;" draggable="true">
  15. 5
  16. </div>
  17. <div style="width: 50px; height: 50px; background-color: Black;" draggable="true">
  18. 6
  19. </div>
  20. <div style="width: 50px; height: 50px; background-color: Orange;" draggable="true">
  21. 7
  22. </div>
  23. <div style="width: 50px; height: 50px; background-color: Olive;" draggable="true">
  24. 8
  25. </div>
  26. <div style="width: 50px; height: 50px; background-color: Teal;" draggable="true">
  27. 9
  28. </div>
  29. <div style="width: 50px; height: 50px; background-color: Green;" draggable="true">
  30. 10
  31. </div>
  32. </body>
現在我們想做一個應用,只有相互有倍數關系的div之間才可用拖放。

首選我們做一個用於輸出調式的小工具代碼

  1. $.log = function(msg) {
  2. console.log(msg);
  3. }
這個我們可以方便的$.log()輸出,而不要寫冗長的console.log了

第一步,編寫dragStart事件函數

  1. function handleDragStart(e) {
  2. this.style.opacity = "0.5";
  3. e.dataTransfer.effectAllowed = "move";
  4. e.dataTransfer.setData("text/plain", this.innerHTML);
  5. //$.log(this.innerHTML);
  6. //$.log(e.target.innerHTML);
  7. //$.log(e.srcElement.innerHTML);
  8. [ ].forEach.call(document.querySelectorAll("div"),
  9. function(item) {
  10. var a = parseInt(e.target.innerHTML);
  11. var b = parseInt(item.innerHTML);
  12. if (a % b != 0 && b % a != 0) {
  13. item.style.opacity = "0.1";
  14. }
  15. });
  16. }
以上的代碼有幾個要點

1 對事件來講this、e.target和e.srcElement都是同一對象

2 在forEach中,this是指item,所以forEach中,我們要用e.target來引用

Copyright © Linux教程網 All Rights Reserved