zoukankan      html  css  js  c++  java
  • 拖放

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <style type="text/css">
                .draggable {
                     200px;
                    height: 200px;
                }
            </style>
        </head>
        <body>
            <div class="draggable" style="position: absolute;background: red;" id="myDiv"></div>
            <p id="status"></p>
            <script type="text/javascript">
                function EventTarget() {
                    this.handlers = {};
                }
    
                EventTarget.prototype = {
                    constructor: EventTarget,
                    addHandler: function(type, handler) {
                        if (typeof this.handlers[type] == "undefined") {
                            this.handlers[type] = [];
                        }
                        this.handlers[type].push(handler);
                    },
                    fire: function(event) {
                        if (!event.target) {
                            event.target = this;
                        }
                        if (this.handlers[event.type] instanceof Array) {
                            var handlers = this.handlers[event.type];
                            for (var i = 0, len = handlers.length; i < len; i++) {
                                handlers[i](event);
                            }
                        }
                    },
                    removeHandler: function(type, handler) {
                        if (this.handlers[type] instanceof Array) {
                            var handlers = this.handlers[type];
                            for (var i = 0, len = handlers.length; i < len; i++) {
                                if (handlers[i] === handler) {
                                    break;
                                }
                            }
                            handlers.splice(i, 1);
                        }
                    }
                };
    
                var EventUtil = {
                    addHandler: function(element, type, handler) { //添加事件
                        if (element.addEventListener) {
                            element.addEventListener(type, handler, false); //使用DOM2级方法添加事件
                        } else if (element.attachEvent) { //使用IE方法添加事件
                            element.attachEvent("on" + type, handler);
                        } else {
                            element["on" + type] = handler; //使用DOM0级方法添加事件
                        }
                    },
                    removeHandler: function(element, type, handler) { //取消事件
                        if (element.removeEventListener) {
                            element.removeEventListener(type, handler, false);
                        } else if (element.detachEvent) {
                            element.detachEvent("on" + type, handler);
                        } else {
                            element["on" + type] = null;
                        }
                    },
                    getEvent: function(event) { //使用这个方法跨浏览器取得event对象
                        return event ? event : window.event;
                    },
                    getTarget: function(event) { //返回事件的实际目标
                        return event.target || event.srcElement;
                    },
                    preventDefault: function(event) { //阻止事件的默认行为
                        if (event.preventDefault) {
                            event.preventDefault();
                        } else {
                            event.returnValue = false;
                        }
                    },
                    stopPropagation: function(event) { //立即停止事件在DOM中的传播
                        //避免触发注册在document.body上面的事件处理程序
                        if (event.stopPropagation) {
                            event.stopPropagation();
                        } else {
                            event.cancelBubble = true;
                        }
                    },
                    getRelatedTarget: function(event) { //获取mouseover和mouseout相关元素
                        if (event.relatedTarget) {
                            return event.relatedTarget;
                        } else if (event.toElement) { //兼容IE8-
                            return event.toElement;
                        } else if (event.formElement) {
                            return event.formElement;
                        } else {
                            return null;
                        }
                    },
                    getButton: function(event) { //获取mousedown或mouseup按下或释放的按钮是鼠标中的哪一个
                        if (document.implementation.hasFeature("MouseEvents", "2.0")) {
                            return event.button;
                        } else {
                            switch (event.button) { //将IE模型下的button属性映射为DOM模型下的button属性
                                case 0:
                                case 1:
                                case 3:
                                case 5:
                                case 7:
                                    return 0; //按下的是鼠标主按钮(一般是左键)
                                case 2:
                                case 6:
                                    return 2; //按下的是中间的鼠标按钮
                                case 4:
                                    return 1; //鼠标次按钮(一般是右键)
                            }
                        }
                    },
                    getWheelDelta: function(event) { //获取表示鼠标滚轮滚动方向的数值
                        if (event.wheelDelta) {
                            return event.wheelDelta;
                        } else {
                            return -event.detail * 40;
                        }
                    },
                    getCharCode: function(event) { //以跨浏览器取得相同的字符编码,需在keypress事件中使用
                        if (typeof event.charCode == "number") {
                            return event.charCode;
                        } else {
                            return event.keyCode;
                        }
                    }
                };
    
                var DragDrop = function() {
                    var dragging = null,
                        diffX = 0,
                        diffY = 0,
                        dragdrop = new EventTarget();
    
                    function handleEvent(event) {
                        // 获取事件和目标
                        event = EventUtil.getEvent(event);
                        var target = EventUtil.getTarget(event);
                        // 确定事件类型
                        switch (event.type) {
                            case "mousedown":
                                if (target.className.indexOf("draggable") > -1) {
                                    dragging = target;
                                    diffX = event.clientX - target.offsetLeft;
                                    diffY = event.clientY - target.offsetTop;
                                    dragdrop.fire({
                                        type: "dragstart",
                                        target: dragging,
                                        x: event.clientX,
                                        y: event.clientY
                                    });
                                }
                                break;
                            case "mousemove":
                                if (dragging !== null) {
                                    // 指定位置
                                    dragging.style.left = (event.clientX - diffX) + "px";
                                    dragging.style.top = (event.clientY - diffY) + "px";
                                    // 触发自定义事件
                                    dragdrop.fire({
                                        type: "drag",
                                        target: dragging,
                                        x: event.clientX,
                                        y: event.clientY
                                    });
                                }
                                break;
                            case "mouseup":
                                dragdrop.fire({
                                    type: "dragend",
                                    target: dragging,
                                    x: event.clientX,
                                    y: event.clientY
                                });
                                dragging = null;
                                break;
                        }
                    }
                    // 公共接口
                    dragdrop.enable = function() {
                        EventUtil.addHandler(document, "mousedown", handleEvent);
                        EventUtil.addHandler(document, "mousemove", handleEvent);
                        EventUtil.addHandler(document, "mouseup", handleEvent);
                    };
                    dragdrop.disable = function() {
                        EventUtil.removeHandler(document, "mousedown", handleEvent);
                        EventUtil.removeHandler(document, "mousemove", handleEvent);
                        EventUtil.removeHandler(document, "mouseup", handleEvent);
                    };
    
                    return dragdrop;
                }();
    
                DragDrop.addHandler("dragstart", function(event) {
                    var status = document.getElementById("status");
                    status.innerHTML = "Started dragging " + event.target.id;
                });
    
                DragDrop.addHandler("drag", function(event) {
                    var status = document.getElementById("status");
                    status.innerHTML = "<br/> Dragged " + event.target.id + " to (" + event.x + "," + event.y + ")";
                });
    
                DragDrop.addHandler("dragend", function(event) {
                    var status = document.getElementById("status");
                    status.innerHTML = "<br/> Dragged " + event.target.id + " to (" + event.x + "," + event.y + ")";
                });
    
                DragDrop.enable();
            </script>
        </body>
    </html>
    
  • 相关阅读:
    SY/T 4206-2019 石油天然气建设工程施工质量验收规范 电气工程
    jmeter-05
    python-02(数组,列表,元祖,词典)的简单操作实例
    linux-13(查看文件命令find、远程传输文件scp,创建文件并更改权限)
    jmeter-04
    关于python的面试题目
    linux-12(find命令的强大搜索功能,删除命令)
    python-01(如何安装python并熟悉类型)
    小程序、app、web测试的区别
    软件测试面试问题及答案
  • 原文地址:https://www.cnblogs.com/xiaoyucoding/p/11629816.html
Copyright © 2011-2022 走看看