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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • leetcode 三数之和_leetcode数组

    leetcode 三数之和_leetcode数组原题链接给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[] 提示:0 <= nums.length <= 300

    2022年8月9日
    2
  • navicat pe15激活码_在线激活

    (navicat pe15激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsaWNlbnNlSW…

    2022年3月27日
    44
  • cocoapods安装过程_如何开发ios应用

    cocoapods安装过程_如何开发ios应用原文链接: iOS开发-CocoaPods安装和使用教程本文是对原文一些错误的修正已经添加了自己的理解。CocoaPods安装和使用教程Code4App原创文章。转载请注明出处:http://code4app.com/article/cocoapods-install-usage目录CocoaPods是什么?如何下载和安装CocoaPods?如何使用CocoaPods?场景1:利用CocoaP

    2025年8月22日
    2
  • mysql左连接和右连接_MYSQL 左连接与右连接

    mysql左连接和右连接_MYSQL 左连接与右连接一、LEFTJOINLEFTJOIN关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为NULL。语法:SELECTcolumn_name(s)FROMtable1LEFTJOINtable2ONtable1.column_name=table2.column_name;举例:下面是选自”Websites”表的数据:下面…

    2022年6月4日
    33
  • linux中nmap命令,Linux中nmap命令起什么作用呢?

    linux中nmap命令,Linux中nmap命令起什么作用呢?摘要:下文讲述Linux中nmap的功能说明,如下所示;nmap是一个网络探测和安全审核的工具,它目前是开放源代码模式nmap命令功能:用于网络探测工具和安全和端口扫描器它可以快速扫描大型网络它运用原始的ip报文的方式发现网络上的主机nmap命令的语法格式:nmap[参数]—–常用参数说明——–traceroute:扫描主机端口并跟踪路由-p:扫描指定端口和端口范围-sP:对目标…

    2022年5月28日
    45
  • c语言 无锁编程,无锁编程与有锁编程的效率总结、无锁队列的实现(c语言)「建议收藏」

    c语言 无锁编程,无锁编程与有锁编程的效率总结、无锁队列的实现(c语言)「建议收藏」1.无锁编程与有锁编程的效率无锁编程,即通过CAS原子操作去控制线程的同步。如果你还不知道什么使CAS原子操作,建议先去查看相关资料,这一方面的资料网络上有很多。CAS实现的是硬件级的互斥,在线程低并发的情况下,其性能比普通互斥锁高效,但是当线程高并发的时候,硬件级互斥引入的代价与应用层的锁竞争产生的代价同样都是很大的。这时普通锁编程其实是优于无锁编程的。硬件级原子操作使应用层的操作变慢,而且无法…

    2022年5月2日
    45

发表回复

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

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