JS中鼠标拖拽div(2)(setCapture()方法和releaseCapture()方法)

JS中鼠标拖拽div(2)(setCapture()方法和releaseCapture()方法)接着鼠标拖拽div(1)解决问题,当在拖拽事件所在的页面按下键盘的ctrl+A全选后,再去拖拽div,浏览器会默认去搜索网页中的内容,拖拽功能就会失效,(搜索网页内容是浏览器的默认行为,所以要想不发生这种情况,就得将其取消,是谁执行之后触发了浏览器的默认行为,就在谁里面returnfalse即可取消浏览器的默认行为,但这种方式ie8及以下的版本不支持。)在ie8及以下版本浏览器中,如果调用了元素的setCapture()方法,那么点击任何事物都会来执行这个元素绑定的响应函数。例如:btn.oncl

大家好,又见面了,我是你们的朋友全栈君。

接着鼠标拖拽div(1)解决问题,当在拖拽事件所在的页面按下键盘的ctrl+A全选后,再去拖拽div,浏览器会默认去搜索网页中的内容,拖拽功能就会失效,(搜索网页内容是浏览器的默认行为,所以要想不发生这种情况,就得将其取消,是谁执行之后触发了浏览器的默认行为,就在谁里面return false即可取消浏览器的默认行为,但这种方式ie8及以下的版本不支持。)

  • 在ie8及以下版本浏览器中,如果调用了元素的setCapture()方法,那么点击任何事物都会来执行这个元素绑定的响应函数。例如:
btn.onclick = function(){ 
   
    alert(1);
};
btn1.onclick = function(){ 
   
    alert(2);
};

btn.setCapture();

在以上的例子中,调用了btn的setCapture()方法,那么点击任何事物都会来执行btn的响应函数,点击刷新、点击网页的其他区域、甚至点击网页以外的电脑桌面,都会弹出”1“,但是这个方法是一次性的。

  • setCapture()方法:捕捉事件,只要触发相应事件就捕捉,“很强横”。

​ 可以将setCapture()方法用到鼠标拖拽div的例子中,但是注意,在给mousedown事件中,调用的box的**setCapture()方法之后,会有一个问题,就是当鼠标松开之后,事件还会一直被捕获,网页中的其他选项都无法点击,而且就算鼠标松开,div也还会跟着鼠标对应的位置移动,为了解决这个问题,就需要在鼠标松开的时候取消捕获,可以使用releaseCapture()**方法来取消先前调用的捕获方法,在mouseup事件中调用box的releaseCapture()方法即可。(如果不涉及ie8浏览器,就不用管这个问题。在火狐中嗲用时不会报错,但是在chrome中没有setCapture()这个方法)。

  • releaseCapture()方法:取消setCapture()方法。

优化拖拽代码

在之前拖拽div的代码中,如果要拖拽多个内容,就需要重新为一个内容绑定事件,所有的操作都要重新写一遍,所以对之前的代码进行了优化:

  • 定义函数,将拖拽的方法封装起来,方便调用,要拖拽哪个元素,调用封装好的函数并传递相应元素的参数即可。

优化后的代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        #box{
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
        }
        #box1{
            width: 100px;
            height: 100px;
            background-color: yellow;
            position: absolute;
            left: 200px;
            top: 200px;
        }
    </style>
    <script type="text/javascript">
        window.onload = function(){  
            var box = document.getElementById("box");

            drag(box);
            drag(box1);
            
        };

        function drag(obj){
            obj.onmousedown = function(event){
                var dx = event.clientX - obj.offsetLeft;
                var dy = event.clientY - obj.offsetTop;
                
                //考虑兼容问题
                // if(box.setCapture){
                //     box.setCapture();
                // }
                obj.setCapture && obj.setCapture();//和上面的判断效果相同,但是使用方便

                document.onmousemove = function(event){
                    event = event || window.event;
                    var left = event.clientX;
                    var top = event.clientY;
                    obj.style.left = left - dx  +"px";
                    obj.style.top = top - dy +"px";

                    document.onmouseup = function(){
                        document.onmousemove = null;
                        document.onmouseup = null;
                        // alert("鼠标松开了");
                        obj.releaseCapture && obj.releaseCapture();//取消setCapture()方法
                    };
                };
            };
        }
    </script>
</head>
<body>
    <div id="box"></div>
    <div id="box1"></div>
</body>
</html>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140862.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Unrecognized Hadoop major version number: 3.0.0[通俗易懂]

    Unrecognized Hadoop major version number: 3.0.0[通俗易懂]Unrecognized Hadoop major version number: 3.0.0

    2022年4月23日
    380
  • k8s基础知识_lable

    k8s基础知识_lable文章目录第三章 资源管理(续)15 命令式对象管理16 命令式对象配置17 声明式对象配置18 资源管理小结第四章 实战入门19 Namespace4.1.1 **查看**4.1.2 **创建**4.1.3 **删除**4.1.4 **使用配置文件(.yaml)进行管理**20 Pod4.2.1 创建并运行4.2.2 查看pod信息4.2.3 访问Pod4.2.4 删除指定Pod4.2.5 配置操作21 Lable4.3.1 命令方式4.3.2 配置方式22 Deployment4.4.1 命令操作4.4.

    2022年8月11日
    9
  • Android源码学习之环境搭建(Ubuntu下载Android源码)

    Android源码学习之环境搭建(Ubuntu下载Android源码)已经有一个多月没有看Android的知识了,之前在杭州时就买了邓凡平的《深入理解Android卷I》一直没来得及研究。后来因为公司要求,要为新的项目做准备,做各种业务的KT和技术的training,虽然新技术本身的难度不大,但是业务知识很是复杂,搞的头大,到现在终于有了一些头绪。趁现在有时间来研究下Android的源码。之前没有接触过Linux系统,我的本本现在用的是Windows系统,已经用习

    2022年5月6日
    40
  • python venv文件夹_pycharm的venv文件夹的自定义处理「建议收藏」

    python venv文件夹_pycharm的venv文件夹的自定义处理「建议收藏」pycharm每次新建项目都需要重新安装库,解决方法如下:新建项目时自定义选择库(自己安装python位置),不要创建新的(如下图)第一完成后,让它记忆我们这个库,新建项目都默认这个库依次打开:Flie-Settings-Project-projectinterpreter点击2号位置的设置图样,会出现如下图,再点击Add选择现有环境(python安装位置)添加第三方库默认地址是http…

    2022年8月28日
    3
  • 字典树(前缀树)_字典树java实现

    字典树(前缀树)_字典树java实现什么是字典树?叫前缀树更容易理解字典树的样子Trie又被称为前缀树、字典树,所以当然是一棵树。上面这棵Trie树包含的字符串集合是{in,inn,int,tea,ten,to}。每个节点的编号是我们为了描述方便加上去的。树中的每一条边上都标识有一个字符。这些字符可以是任意一个字符集中的字符。比如对于都是小写字母的字符串,字符集就是’a’-‘z’;对于都是数字的字符串,字…

    2025年9月30日
    3
  • python 获取B站播放量计算的条件及……

    python 获取B站播放量计算的条件及……

    2021年11月10日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号