Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)


Posted in Javascript onJanuary 23, 2015

今天我们就来解决上一次拖拽雏形中的一些问题。下面看看有哪些问题?

附上上期的Javascript代码,方便大家查看问题。

<script type="text/javascript">
   window.onload = function() {
    var oDiv = document.getElementById("div1");
    var disX = 0;
    var disY = 0;
    oDiv.onmousedown = function(ev) {
     var oEvent = ev || event; 
     disX = oEvent.clientX - oDiv.offsetLeft; 
     disY = oEvent.clientY - oDiv.offsetTop;

     oDiv.onmousemove = function(ev) {
      var oEvent = ev || event;
      oDiv.style.left = oEvent.clientX - disX+'px'; 
      oDiv.style.top = oEvent.clientY - disY+'px';
     };
     oDiv.onmouseup = function() {
      oDiv.onmousemove = null;
      oDiv.onmouseup = null;
     };

    };

   };
  </script>

1. 现在的这个拖拽如果我鼠标移动的快点,Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)你会发现这个鼠标从这个div出来了,这个时候div不会跟着鼠标走了。

那为什么会出现这个问题呢?

原因其实很简单,mousemove的事件我们是给div加的,所以鼠标一旦脱离了这个div,那么这个时候mousemove已经不触发了。

解决方案: 事件加载document 上,因为你鼠标无论如何都还在页面里面,怎么样都会触发mousemove 这样移动的在快也没问题。

那么我们相应的修改下代码。

<script type="text/javascript">
   window.onload = function() {
    var oDiv = document.getElementById("div1");
    var disX = 0;
    var disY = 0;
    oDiv.onmousedown = function(ev) {
     var oEvent = ev || event; 
     disX = oEvent.clientX - oDiv.offsetLeft; 
     disY = oEvent.clientY - oDiv.offsetTop;
    // 事件加载document 上
     document.onmousemove = function(ev) {
      var oEvent = ev || event;
      oDiv.style.left = oEvent.clientX - disX+'px';
      oDiv.style.top = oEvent.clientY - disY+'px';
     };
     oDiv.onmouseup = function() {
      document.onmousemove = null;
      oDiv.onmouseup = null; 
     };

    };

   };
  </script>

那么这个问题就可以解决了。

2. 我们看看现在还有什么问题,虽然拖的快的问题解决了,但是当我把鼠标移动到这个位置

Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)

现在可以明显看到鼠标不在div上,如果这个时候抬起鼠标,你可以看到回来之后它还会动。Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理) 这就又是一个bug!

其实这个问题和上面的是一样的。所以呢解决起来也很简单我们把mouseup也加到document上,我们来试一下看看

document.onmouseup = function() { 
      document.onmousemove = null; 
      document.onmouseup = null; 
     };

这样 现在如果在移动到刚才的那个位置,就不会在出现之前的bug了,并且移动的快也没有任何的问题。一切都很正常。

3. 我们看看浏览器兼容的问题

其实在低版本的火狐浏览器中有这样一个问题
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)。怎么出现的呢,当你第一次拖的时候是对的,在拖一次的时候按住在移动,你会发现会有个这个影子在后面。这个是怎么回事呢?

实际上来说我们现在拖动的是一个空的div火狐是有bug的,那么如果在div中加点内容呢

Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)

你会发现现在又没有问题了。

所以火狐的bug就只有在空div中出现的。

解决方案:

其实很简单,我们就只要阻止浏览器默认事件就可以了 return false; 在onmousedown中。 为什么要加在onmousedown中呢?

大家可以想一下,拖拽是从哪个事件开始的,是从onmousedown开始的吧,当鼠标按下的时候拖拽就开始了。所以要加载onmousedown中。

实际上就是加了一句return false; 把火狐的bug屏蔽掉了。

这样不管怎么拖就没有问题了。

附上代码:

<script type="text/javascript">
   window.onload = function() {
    var oDiv = document.getElementById("div1");
    var disX = 0;
    var disY = 0;
    oDiv.onmousedown = function(ev) {
     var oEvent = ev || event;
     disX = oEvent.clientX - oDiv.offsetLeft;
     disY = oEvent.clientY - oDiv.offsetTop;
     // 事件加载document 上
     document.onmousemove = function(ev) {
      var oEvent = ev || event;
      oDiv.style.left = oEvent.clientX - disX+'px';
      oDiv.style.top = oEvent.clientY - disY+'px';
     };
     document.onmouseup = function() {
      document.onmousemove = null;
      document.onmouseup = null;
     };

     return false;

    };

   };
  </script>

现在程序是完整了,但是在用户体验上还有一些问题。

比如说用户可能会把这个div拖出浏览器外面,那怎么解决呢?

那我们就在加个判断呗。 这个很简单吧,如果从左边出去了

Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)

,那就直接等于0,他就从左边出不去了。那么上边也是一样的。

那么怎么防止不能从右边出去?? 画个图就清楚了。 其实我们只要把页面的可视取的宽度减掉div的宽度就能算出来了。

那这个就是所谓的最大值,判断一下如果移动的距离超过了这个最大值就等于这个最大值即可。那么下边是一样的。

附上完整代码:

<script type="text/javascript">
       // 拖拽空div 低版本的火狐有bug
      window.onload = function() {
        var oDiv = document.getElementById("div1");var disX = 0;
        var disY = 0;
        oDiv.onmousedown = function(ev) {
          var oEvent = ev || event;
          disX = oEvent.clientX - oDiv.offsetLeft;
          disY = oEvent.clientY - oDiv.offsetTop;

          document.onmousemove = function(ev) {
            var oEvent = ev || event;
            // 存储div当前的位置
            var oDivLeft = oEvent.clientX - disX;
            var oDivTop = oEvent.clientY - disY;


            // 从左边拖出去了
            if (oDivLeft < 0) {
              oDivLeft = 0;
            } else if (oDivLeft > document.documentElement.clientWidth - oDiv.offsetWidth) {
              oDivLeft = document.documentElement.clientWidth - oDiv.offsetWidth;
            }

            if (oDivTop < 0) {
              oDivTop = 0;
            } else if (oDivTop > document.documentElement.clientHeight - oDiv.offsetHeight) {
              oDivTop = document.documentElement.clientHeight - oDiv.offsetHeight;
            }

            oDiv.style.left = oDivLeft + 'px';
            oDiv.style.top = oDivTop + 'px';
          };

          document.onmouseup = function() {
            document.onmousemove = null;
            document.onmouseup = null;
          };
          return false; // 阻止默认事件,解决火狐的bug
        };
      };
    </script>

那么现在这个拖拽就比较完整啦。O(∩_∩)O

Javascript 相关文章推荐
jQuery中的常用事件总结
Dec 27 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
Feb 25 Javascript
原生javascript实现拖动元素示例代码
Sep 01 Javascript
Javascript毫秒数用法实例
Feb 05 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
Apr 30 Javascript
基于javascript实现文字无缝滚动效果
Mar 22 Javascript
JavaScript实现无穷滚动加载数据
May 06 Javascript
详解Vue2.0里过滤器容易踩到的坑
Jun 01 Javascript
js中变量的连续赋值(实例讲解)
Jul 08 Javascript
快速了解vue-cli 3.0 新特性
Feb 28 Javascript
微信小程序实现自上而下字幕滚动
Jul 14 Javascript
详解Node.js如何处理ES6模块
May 15 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 #Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 #Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
Jan 23 #Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 #Javascript
jQuery选择器querySelector的使用指南
Jan 23 #Javascript
jQuery中DOM操作实例分析
Jan 23 #Javascript
jquery实现点击页面计算点击次数
Jan 23 #Javascript
You might like
PHP 模拟$_PUT实现代码
2010/03/15 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
2015/11/16 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
tensorflow识别自己手写数字
2018/03/14 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
培训讲师邀请函
2014/01/10 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
Golang Gob编码(gob包的使用详解)
2021/05/07 Golang
详解python的内存分配机制
2021/05/10 Python
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python