鼠标捕获(setCapture,releaseCapture)的学习

鼠标捕获(setCapture,releaseCapture)的学习鼠标捕获(setCapture)作用是将鼠标事件捕获到当前文档的指定的对象——对指定的对象设置鼠标捕获。这个对象会为当前应用程序或整个系统接收所有鼠标事件。所谓鼠标捕获,是指对鼠标事件(onmousedown,onmouseup,onmousemove,onclick,ondblclick,onmouseover,onmouseout)进行捕捉,使在容器内的子对象的鼠标事件均…

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

鼠标捕获(setCapture)作用是将鼠标事件捕获到当前文档的指定的对象——对指定的对象设置鼠标捕获。这个对象会为当前应用程序或整个系统接收所有鼠标事件。

  • 所谓鼠标捕获,是指对鼠标事件(onmousedown, onmouseup, onmousemove, onclick, ondblclick, onmouseover, onmouseout)进行捕捉,使在容器内的子对象的鼠标事件均由容器对象触发,因此,只能在容器对象的鼠标事件函数中进行处理。
  • 当参数为true时,对鼠标进行捕捉,相反,不捕捉。
  • 与这个函数对应,releaseCapture方法释放鼠标捕获,并触发onlosecapture事件。

一、语法

1. MDN(Mozilla Developer Network)

element.setCapture(retargetToElement);

retargetToElement——If true, all events are targeted directly to this element; if false, events can also fire at descendants of this element.

document.releaseCapture()

释放鼠标捕捉——Once mouse capture is released, mouse events will no longer all be directed to the element on which capture is enabled.

2. msdn(Internet Explorer Dev Center

object.setCapture(containerCapture)

其中: containerCapture [in, optional]—— Type:
Boolean

  • true (true)——Default. 容器会捕获容器内所有对象的鼠标事件,即容器内的对象不会触发鼠标事件(跟容器外的对象一样)Events originating in a container are captured by the container.
  • false (false)——容器不会捕获容器内对象的鼠标事件,即容器内的对象可以正常地触发事件和取消冒泡。Events originating in a container are not captured by the container.

  object.setCapture() 当一个object的被 setCapture 后,他的方法将会被继承到整个文档进行捕获。当不需要把方法继承到整个文档捕获时,要用 object.releaseCapture() 来释放.

二、案例——简单拖拽

完整代码

<!DOCTYPE html>
<html>
<head>
<title>drag example</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<style type="text/css">
#drag{
    
    position:absolute;left:12px;top:24px;width:100px;height:150px; display:block;border:1px solid #000000;z-index:1;background:#eeeeee; cursor: pointer;}
</style>
</head>
<body>
<div id="drag">drag me</div>
<script type="text/javascript">
window.onload=function(){
    objDiv = document.getElementById("drag");
    drag(objDiv);
};
function drag(dv){
    dv.onmousedown=function(e){
        var d=document;
        e = e || window.event;

        var x= e.layerX || e.offsetX;
        var y= e.layerY || e.offsetY;

        //设置捕获范围
        if(dv.setCapture){
            dv.setCapture();
        }else if(window.captureEvents){
            window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
        }

        d.onmousemove=function(e){
            e= e || window.event;
            if(!e.pageX)e.pageX=e.clientX;
            if(!e.pageY)e.pageY=e.clientY;
            document.getElementById("drag").innerHTML= e.pageX+ e.pageY;
            var tx=e.pageX-x;
            var ty=e.pageY-y;
            dv.style.left=tx+"px";
            dv.style.top=ty+"px";
        };
        d.onmouseup=function(){
            //取消捕获范围
            if(dv.releaseCapture){
                dv.releaseCapture();
            }else if(window.captureEvents){
                window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
            }
            //清除事件
            d.onmousemove=null;
            d.onmouseup=null;
        };
    };
}
</script>
</body>
</html>

三、案例——完美拖拽

完整代码

鼠标捕获(setCapture,releaseCapture)的学习
鼠标捕获(setCapture,releaseCapture)的学习

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>完美拖拽</title>
<style type="text/css">
html,body{
     
     overflow:hidden;}
body,div,h2,p{
     
     margin:0;padding:0;}
body{
     
     color:#fff;background:#000;font:12px/2 Arial;}
p{
     
     padding:0 10px;margin-top:10px;}
span{
     
     color:#ff0;padding-left:5px;}
#box{
     
     position:absolute;width:300px;height:150px;background:#333;border:2px solid #ccc;top:50%;left:50%;margin:-75px 0 0 -150px;}
#box h2{
     
     height:25px;cursor:move;background:#222;border-bottom:2px solid #ccc;text-align:right;padding:0 10px;}
#box h2 a{
     
     color:#fff;font:12px/25px Arial;text-decoration:none;outline:none;}
</style>
<script type="text/javascript">
window.onload=function (){
    var oBox=document.getElementById("box");
    var oH2 = oBox.getElementsByTagName("h2")[0];
    var oA = oBox.getElementsByTagName("a")[0];
    var aSpan = oBox.getElementsByTagName("span");    
    var disX = disY = 0;
    var bDrag = false;
    var aPos = [{x:oBox.offsetLeft, y:oBox.offsetTop}];
    
    //鼠标按下, 激活拖拽
    oH2.onmousedown = function (event){        
        var event = event || window.event;
        bDrag = true;
        disX = event.clientX - oBox.offsetLeft;
        disY = event.clientY - oBox.offsetTop;        
        aPos.push({x:oBox.offsetLeft, y:oBox.offsetTop})
        
        this.setCapture && this.setCapture();        
        return false;
    };
    
    //拖拽开始
    document.onmousemove = function (event){
        if (!bDrag) return;
        var event = event || window.event;
        var iL = event.clientX - disX;
        var iT = event.clientY - disY;
        var maxL = document.documentElement.clientWidth - oBox.offsetWidth;
        var maxT = document.documentElement.clientHeight - oBox.offsetHeight;
        
        iL = iL < 0 ? 0 : iL;
        iL = iL > maxL ? maxL : iL; 
        
        iT = iT < 0 ? 0 : iT;
        iT = iT > maxT ? maxT : iT;
        
        oBox.style.marginTop = oBox.style.marginLeft = 0;
        oBox.style.left = iL + "px";
        oBox.style.top = iT + "px";    
        aPos.push({x:iL, y:iT})
        
        status();
        
        return false;
    };

    //鼠标释放, 结束拖拽
    document.onmouseup = window.onblur = oH2.onlosecapture = function (){
        bDrag = false;                
        oH2.releaseCapture && oH2.releaseCapture();
        status();
    };
    
    //回放拖动轨迹
    oA.onclick = function (){
        if (aPos.length == 1) return;
        var timer = setInterval(function ()    {
            var oPos = aPos.pop();
            oPos ? (oBox.style.left = oPos.x + "px", oBox.style.top = oPos.y + "px", status()) : clearInterval(timer)
        }, 30);        
        this.focus = false;//去除链接虚线        
        return false;
    };
    
    //阻止冒泡
    oA.onmousedown = function (event){
        (event || window.event).cancelBubble = true
    };
    
    //监听状态函数
    function status (){
        aSpan[0].innerHTML = bDrag;
        aSpan[1].innerHTML = oBox.offsetTop;
        aSpan[2].innerHTML = oBox.offsetLeft;
    }
    
    //初始调用
    status();
};
</script>
</head>
<body>
<div id="box">
    <h2><a href="javascript:;">点击回放拖动轨迹</a></h2>
    <p><strong>Drag:</strong><span></span></p>
    <p><strong>offsetTop:</strong><span></span></p>
    <p><strong>offsetLeft:</strong><span></span></p>
</div>
</body>
</html>

View Code

javascript代码

//鼠标按下, 激活拖拽
    oH2.onmousedown = function (event){        
        var event = event || window.event;
        bDrag = true;
        disX = event.clientX - oBox.offsetLeft;
        disY = event.clientY - oBox.offsetTop;        
        aPos.push({x:oBox.offsetLeft, y:oBox.offsetTop});        
        this.setCapture && this.setCapture();        
        return false;
    };
    
    //拖拽开始
    document.onmousemove = function (event){
        if (!bDrag) return;
        var event = event || window.event;
        var iL = event.clientX - disX;
        var iT = event.clientY - disY;
        var maxL = document.documentElement.clientWidth - oBox.offsetWidth;
        var maxT = document.documentElement.clientHeight - oBox.offsetHeight;
        
        iL = iL < 0 ? 0 : iL;    
        iL = iL > maxL ? maxL : iL; 
        
        iT = iT < 0 ? 0 : iT;
        iT = iT > maxT ? maxT : iT;
        
        oBox.style.marginTop = oBox.style.marginLeft = 0;
        oBox.style.left = iL + "px";
        oBox.style.top = iT + "px";    
        aPos.push({x:iL, y:iT})        
        status();        
        return false;
    };

    //鼠标释放, 结束拖拽
    document.onmouseup = window.onblur = oH2.onlosecapture = function (){
        bDrag = false;                
        oH2.releaseCapture && oH2.releaseCapture();
        status();
    };
    //阻止冒泡
    oA.onmousedown = function (event){
        (event || window.event).cancelBubble = true
    };
    
    //监听状态函数
    function status (){
        aSpan[0].innerHTML = bDrag;
        aSpan[1].innerHTML = oBox.offsetTop;
        aSpan[2].innerHTML = oBox.offsetLeft;
    }

参考:

  • https://developer.mozilla.org/en-US/docs/Web/API/Element.setCapture
  • http://msdn.microsoft.com/en-us/library/ie/ms536742%28v=vs.85%29.aspx
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • pep8风格指南_pep方案是什么意思

    pep8风格指南_pep方案是什么意思参考链接:https://github.com/jackfrued/Python-100-DaysPEP8风格指南  PEP是PythonEnhancementProposal的缩写,通常翻译为“Python增强提案”。每个PEP都是一份为Python社区提供的指导Python往更好的方向发展的技术文档,其中的第8号增强提案(PEP8)是针对Python语言编订的代码风格指南。尽管我们…

    2025年6月14日
    0
  • iOS开发常用国外网站清单

    iOS开发常用国外网站清单工欲善其事必先利其器,最近发现临时查找一些东西容易浪费时间,花了点时间整理一下常用的网站,方便以后备用。国内的code4app,ui4app,cocoachina,oschina,csdn就不说了,基本上很好用。不过国外网站上的好东西更多,可惜找起来也更费时间,需要整理一下。主要分开发教程、示例项目、UI设计、问题解决几块。开发教程:即便过了入门阶段,还是要

    2022年7月12日
    14
  • ES6 数组方法归纳整理

    ES6 数组方法归纳整理ES6操作数组方法1.判断是否为数组 letarr=[1,2,3] console.log(Array.isArray(arr))//true console.log(Array.isArray([]))//true2.创建数组newArray()创建数组如果使用Array构造函数传入一个数值型的值,那么数组的长度length属性会被设置为该值; letitems=newArray(2); console.log(items.length);//2

    2022年6月9日
    28
  • 第一天来到新公司的volg (ETL开发工程师)[通俗易懂]

    第一天来到新公司的volg (ETL开发工程师)[通俗易懂]第一天来到新公司的volg(ETL开发工程师)新的改变首先自我介绍一下,我是一名刚刚大学毕业的程序猿,在大学完了两年,到最后大三一年才开始认真的去学习编程的各种知识,开源框架,看视频代码。现在是大数据时代,我也想跟着潮流,所以我第一份工作就选择了ETL开发,为以后大数据开发做基础铺垫,毕竟现在大数据开发都没公司直接招实习生或刚刚毕业的人。新的工作先说一下今天来公司吧,上午大概就是9点到…

    2022年6月6日
    77
  • oracle中sequence是什么意思_consequence的用法

    oracle中sequence是什么意思_consequence的用法在oracle中sequence就是序号,每次取的时候它会自动增加。sequence与表没有关系。1、CreateSequence首先要有CREATESEQUENCE或者CREATEANYSEQUENCE权限。创建语句如下:sql;”>CREATESEQUENCEseqTestINCREMENTBY1–每次加几个STARTWITH1–从1开始计数NOMAXva…

    2022年10月19日
    0
  • Qt框架简介

    Qt框架简介这里的Qt不是指Qt语音平台,而是指GUI框架。截止至2019年12月,Qt的最新版本是5.14.0,但仍有很多资料是基于Qt4,为了避免大家误入歧途,所以写了这篇文章。Qt一开始是由奇趣公司开发的,后来被Nokia收购了,然后再被Digia收购了。所以有的人会误以为Qt就是为了塞班系统而生,是个落伍的产物。但是很多嵌入式软件、桌面工具都是用Qt来开发的,包括Quartus和Caden…

    2022年5月16日
    975

发表回复

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

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