拖拽中怎麼修復bug

簡易拖拽

 1. ==   鼠標按下    接着移動鼠標

   bar.onmousedown =function(){

           document.onmousemove = function(){

            }

}

2. 當我們按下鼠標的時候,就要記錄當前 鼠標的位置 - 大盒子的位置
 算出  bar  當前在 大盒子內的距離 。

3.   防止選擇拖動(防止複製文字)

我們知道按下鼠標然後拖拽可以選擇文字 的。

清除選中的內容

window.getSelection? window.getSelection().removeAllRanges() : document.selection.empty();

 l拖拽原理  
l距離不變
l三個事件:onmousedown鼠標按下、onmousemove鼠標撫摸、onmouseup鼠標彈起
l靠譜拖拽
l原有拖拽的問題
l直接給document加事件
lFF下,空Div拖拽Bug
l阻止默認事件
l防止拖出頁面
l修正位置
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>無標題文檔</title>
  6. <style>
  7. #div1 {width:200px; height:200px; background:red; position:absolute;}
  8. </style>
  9. <script>
  10. window.onload=function ()
  11. {
  12. var oDiv=document.getElementById('div1');
  13. var disX=0;
  14. var disY=0;
  15. oDiv.onmousedown=function (ev)
  16. {
  17. var oEvent=ev||event;
  18. disX=oEvent.clientX-oDiv.offsetLeft;
  19. disY=oEvent.clientY-oDiv.offsetTop;
  20. document.onmousemove=function (ev)
  21. {
  22. var oEvent=ev||event;
  23. oDiv.style.left=oEvent.clientX-disX+'px';
  24. oDiv.style.top=oEvent.clientY-disY+'px';
  25. };
  26. document.onmouseup=function ()
  27. {
  28. document.onmousemove=null;
  29. document.onmouseup=null;
  30. };
  31. };
  32. };
  33. </script>
  34. </head>
  35. <body>
  36. <div id="div1"></div>
  37. </body>
  38. </html>
上面的這個拖拽有個bug,移動速度快和移動到瀏覽器頭部的時候,大家觀察一下,會出現問題。原因是盒子的作用域比較小,很容易移出本來盒子的區域導致代碼不起作用,我們改進一下:
  1. <script>
  2. window.onload=function ()
  3. {
  4. var oDiv=document.getElementById('div1');
  5. var disX=0;
  6. var disY=0;
  7. oDiv.onmousedown=function (ev)
  8. {
  9. var oEvent=ev||event;
  10. disX=oEvent.clientX-oDiv.offsetLeft;
  11. disY=oEvent.clientY-oDiv.offsetTop;
  12. document.onmousemove=function (ev)
  13. {
  14. var oEvent=ev||event;
  15. oDiv.style.left=oEvent.clientX-disX+'px';
  16. oDiv.style.top=oEvent.clientY-disY+'px';
  17. };
  18. document.onmouseup=function ()
  19. {
  20. document.onmousemove=null;
  21. document.onmouseup=null;
  22. };
  23. };
  24. };
  25. </script>
上面這個代碼,在火狐裏面,有問題:出現鬼影,第二次拖拽的時候,出現問題:
  1. <script>
  2. window.onload=function ()
  3. {
  4. var oDiv=document.getElementById('div1');
  5. var disX=0;
  6. var disY=0;
  7. oDiv.onmousedown=function (ev)
  8. {
  9. var oEvent=ev||event;
  10. disX=oEvent.clientX-oDiv.offsetLeft;
  11. disY=oEvent.clientY-oDiv.offsetTop;
  12. document.onmousemove=function (ev)
  13. {
  14. var oEvent=ev||event;
  15. oDiv.style.left=oEvent.clientX-disX+'px';
  16. oDiv.style.top=oEvent.clientY-disY+'px';
  17. };
  18. document.onmouseup=function ()
  19. {
  20. document.onmousemove=null;
  21. document.onmouseup=null;
  22. };
  23. return false;
  24. };
  25. };
  26. </script>
這個拖拽可以扔到不可視區域,放開鼠標就找不到了。再繼續修復bug:
  1. <script>
  2. window.onload=function ()
  3. {
  4. var oDiv=document.getElementById('div1');
  5. var disX=0;
  6. var disY=0;
  7. oDiv.onmousedown=function (ev)
  8. {
  9. var oEvent=ev||event;
  10. disX=oEvent.clientX-oDiv.offsetLeft;
  11. disY=oEvent.clientY-oDiv.offsetTop;
  12. document.onmousemove=function (ev)
  13. {
  14. var oEvent=ev||event;
  15. var l=oEvent.clientX-disX;
  16. var t=oEvent.clientY-disY;
  17. if(l<0)
  18. {
  19. l=0;
  20. }
  21. else if(l>document.documentElement.clientWidth-oDiv.offsetWidth)
  22. {
  23. l=document.documentElement.clientWidth-oDiv.offsetWidth;
  24. }
  25. if(t<0)
  26. {
  27. t=0;
  28. }
  29. else if(t>document.documentElement.clientHeight-oDiv.offsetHeight)
  30. {
  31. t=document.documentElement.clientHeight-oDiv.offsetHeight;
  32. }
  33. oDiv.style.left=l+'px';
  34. oDiv.style.top=t+'px';
  35. };
  36. document.onmouseup=function ()
  37. {
  38. document.onmousemove=null;
  39. document.onmouseup=null;
  40. };
  41. return false;
  42. };
  43. };
  44. </script>
發佈了30 篇原創文章 · 獲贊 31 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章