为了账号安全,请及时绑定邮箱和手机立即绑定

元芳,你怎么看?

女老师果然是女老师,逻辑能力不行啊,你就直接说,光标移动多少距离,目标元素的左上角位置就移动多少,不就行了。为什么要去关心光标在目标元素的位置呢。。。

还有写的js代码,重用性不高。

UtilJS.EventUtil.addEmulationalDnD = function(element){
        if(!element)//element是必须的参数
            throw new ReferenceError("Calling UtilJS.EventUtil.addEmulationalDnD() without element argument.");

        //通过给element添加一个hasDnD的属性,解决同一个元素绑定多次拖拽事件的情况
        if(typeof element.hasDnD == "undefined") element.hasDnD = false;
        if(element.hasDnD == true)
            return;
        else
            element.hasDnD = true;
        
        //处理“非绝对定位(position:absolute;)的元素添加拖拽事件”的情况
        element.style.position = "absolute";
        var rect = element.getBoundingClientRect();
        if(!element.style.left) element.style.left = rect.left + "px";
        if(!element.style.top) element.style.top = rect.top + "px";

        var startPos = { x : 0, y : 0, };//记录鼠标按下的起始位置
        var leftTopPos = { left : 0, top : 0, };//记录每次拖拽目标元素的左上角坐标
        var isPressed = false;//鼠标是否在目标元素上按下的标记

        //鼠标左键按下事件
        function mousePressed(event){
            event = UtilJS.EventUtil.getEvent(event);
            startPos.x = event.clientX;
            startPos.y = event.clientY;
            leftTopPos.left = parseInt(element.style.left.split("px")[0]);
            leftTopPos.top = parseInt(element.style.top.split("px")[0]);
            isPressed = true;
        }

        //当鼠标左键在目标元素上按下后,鼠标在文档中移动的同时拖动目标元素
        function mouseMovedAfterPressed(event){
            if(!isPressed)
                return;

            var startDragDistance = 4;//超过4个像素,则开始拖拽
            var xDis = event.clientX - startPos.x;
            var yDis = event.clientY - startPos.y;

            if(Math.sqrt(xDis*xDis + yDis*yDis) <= startDragDistance) return;

            event = UtilJS.EventUtil.getEvent(event);
            element.style.cursor = "move";
            element.style.left = leftTopPos.left + xDis + "px";
            element.style.top = leftTopPos.top + yDis + "px";
        }

        //鼠标左键松开
        function mouseReleasedOnElement(){
            element.style.cursor = "default";
            isPressed = false;
        }

        this.addBubblingHandler(element, "mousedown", mousePressed);
        this.addBubblingHandler(element, "mouseup", mouseReleasedOnElement);
        this.addBubblingHandler(document, "mousemove", mouseMovedAfterPressed);

        return [mousePressed, mouseReleasedOnElement, mouseMovedAfterPressed];
    };

    /* 为目标对象注销拖放事件 */
    UtilJS.EventUtil.removeEmulationalDnD = function(element, handlers){
        if(!element || !handlers || handlers.length!==3) return;

        this.removeBubblingHandler(element, "mousedown", handlers[0]);
        this.removeBubblingHandler(element, "mouseup", handlers[1]);
        this.removeBubblingHandler(document, "mousemove", handlers[2]);
    }

其中的addBubblingHandler和removeBubblingHandler是前面几节讲的跨浏览器兼容的注册、注销事件监听器的函数。

addEmulationalDnD可以为任意元素添加拖拽事件。如果有什么bug,欢迎指正。

正在回答

1 回答

上面的鼠标左键并没有处理,可以自行添加之。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

元芳,你怎么看?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信