美文网首页
拖拽------阻止浏览器默认事件

拖拽------阻止浏览器默认事件

作者: 尤樊容 | 来源:发表于2017-05-02 16:08 被阅读680次

用原生js写一个拖拽,需要考虑到兼容的问题,事件绑定的问题,浏览器默认事件的问题。
首先需要用到Event 对象,代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>拖拽</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            background: red;
            position: absolute;
            top: 0;
            left: 0;
        }
    </style>
    <script>
        //这是前面封装过的domReady
        function domReady(fn){
            if(document.addEventListener){
                document.addEventListener('DOMContentLoaded',function(){
                    fn&&fn();//处理事情
                },false);
            }else{
                /*监控资源情况,ie8及以下不支持addEventListener*/
                document.onreadystatechange=function(){
                    /*dom加载完成的时候*/
                    if(document.readyState=='complete'){
                        fn&&fn();//处理事情
                    }
                };
            }
        }
        //事件绑定兼容
        function addEvent(obj,oEvn,fn){
            if(obj.addEventListener){
                obj.addEventListener(oEvn,fn,false);
            }else{
                obj.attachEvent('on'+oEvn,fn);
            }
        }
        //解除事件绑定
        function removeEvent(obj,oEvn,fn){
            if(obj.removeEventListener){
                obj.removeEventListener(oEvn,fn,false);
            }else{
                obj.detachEvent('on'+oEvn,fn);
            }
        }

        domReady(function(){
            var oBox=document.getElementById('div1');
            function down(ev){
                var oEvent = ev || event;
                var disX=oEvent.clientX-oBox.offsetLeft;
                var disY=oEvent.clientY-oBox.offsetTop;
                function move(ev){
                    var oEvent=ev||event;
                    var l=oEvent.clientX-disX;
                    var t=oEvent.clientY-disY;
                    if(l<0){
                        l=0;
                    }
                    if(l>document.documentElement.clientWidth-oBox.offsetWidth){
                        l=document.documentElement.clientWidth-oBox.offsetWidth;
                    }
                    if(t<0){
                        t=0;
                    }
                    if(t>document.documentElement.clientHeight-oBox.offsetHeight){
                        t=document.documentElement.clientHeight-oBox.offsetHeight;
                    }
                    oBox.style.left=l+'px';
                    oBox.style.top=t+'px';
                }
                function up(){
                    removeEvent(document,"mousemove",move);
                    removeEvent(document,"mouseup",up);
                    //释放捕获
                    oBox.releaseCapture && oBox.releaseCapture();
                }
                addEvent(document,"mousemove",move);
                addEvent(document,"mouseup",up);
                //设置捕获
                oBox.setCapture && oBox.setCapture();
                //阻止浏览器默认事件
                oEvent.preventDefault && oEvent.preventDefault();
                return false;
            }
            addEvent(oBox,"mousedown",down);
        });
    </script>
</head>
<body>
<div id="div1"></div>
<p>拖拽取消浏览器默认事件</p>
</body>
</html>

可以兼容ie低版本,拖拽的同时取消了浏览器默认事件,不会选中文字。

相关文章

网友评论

      本文标题:拖拽------阻止浏览器默认事件

      本文链接:https://www.haomeiwen.com/subject/smsgzttx.html