拖拽中怎么修复bug

来源:互联网 发布:手机简单编曲软件 编辑:程序博客网 时间:2024/06/02 16:29

简易拖拽

 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>
0 0
原创粉丝点击