添加自定义事件

添加自定义事件

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>添加自定义事件</title>
<style>
    .box{
        width: 150px;
        height: 150px;
        background: red;
        position: absolute;
    }
</style>
</head>
<body>
    <div id='status' class='box'>
       
    </div>
    <script>

        function EventTarget(){
            this.handlers = {}
        }
        EventTarget.prototype = {
            //添加一个事件
            addHandler: function(type,handler){
                //this.handlers[type] = handler;
                if(typeof this.handlers[type] == 'undefined'){
                    this.handlers[type] = [];
                }
                this.handlers[type].push(handler);
                console.log(this.handlers[type]);
            },
            //触发一个事件
            fire: function(event){
                //这里为何要这样指定this
                if(!event.target){
                    event.target = this;
                }
                //this.handlers[type]();
                var handlers = this.handlers[event.type];
                console.log(handlers);
                //这里为何要判断?
                if(handlers instanceof Array){
                    for(var i=0;i<handlers.length;i++){
                        handlers[i](event);
                    }
                }
            },
            //移除一个事件
            removeHandler: function(type,handler){
                // this.handlers[type] = null;
                var handlers = this.handlers[type];
                if(handlers instanceof Array){
                    for(var i=0;i<handlers.length;i++){
                        if(handlers[i] == handler){
                            break;
                        }
                    }
                    handlers.splice(i,1);
                }
            }
        }
        var EventUtil = {
            addHandle: function(element,type,handle){
                if(element.addEventListener){
                    element.addEventListener(type,handle,false);
                }else if(element.atachEvent){
                    element.attachEvent('on'+type,handle);
                }else {
                    element['on'+type] = handle;
                }
            },
            removeHandle: function(element,type,handle){
                if(element.removeEventListener){
                    element.removeEventListener(type,handle,false);
                }else if(element.detachEvent){
                    element.detachEvent('on'+type,handle);
                }else {
                    element['on'+type] = handle;
                }
            },
            getEvent: function(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){
                if(event.stopPropagation){
                    event.stopPropagation();
                }else {
                    event.cancelBubble = true;
                }
            }
        }
        //添加自定义事件
        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);
                console.log('target',target);
                //确定事件
                switch(event.type){
                    case 'mousedown': 
                        console.log('mousedown');
                        if(event.target.className.indexOf('box')>-1){
                            
                            dragging = target;
                            diffX = event.clientX - target.offsetLeft;
                            diffY = event.clientY - target.offsetTop;
                            dragdrop.fire({
                                type: 'dragstart',
                                target: dragging,
                                x:event.clienX,
                                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.addHandle(document,'mousedown',handleEvent);
                EventUtil.addHandle(document,'mousemove',handleEvent);
                EventUtil.addHandle(document,'mouseup',handleEvent);
            },
            dragdrop.disable = function(){
                EventUtil.removeHandle(document,'mousedown',handleEvent);
                EventUtil.removeHandle(document,'mousemove',handleEvent);
                EventUtil.removeHandle(document,'mouseup',handleEvent);
            }
            return dragdrop;
        }()
        
        DragDrop.enable();
        
        DragDrop.addHandler('dragstart',function(event){
            var status = document.getElementById('status');
            status.innerHTML = 'start:'  + event.target.id;
        });
        DragDrop.addHandler('drag',function(event){
            var status = document.getElementById('status');
            status.innerHTML = "ing:" + event.target.id+ "("+event.x + ',' + event.y +")";
        });
        DragDrop.addHandler("dragend",function(event){
            var status = document.getElementById('status');
            status.innerHTML = "end:" + event.target.id+ "("+event.x + ',' + event.y +")";
        });

    </script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/boysky0015/article/details/95315889