vue通过父组件调用子组件里面的方法,子组件的方法通过全局定义的eventLists获取到所有已绑定事件,移除并重新绑定该事件,防止重复绑定

49 篇文章 0 订阅

引子:原生JS貌似没有获取元素已绑定事件的方法,查了查实在没找到,只能自个儿写一个了
有人说让用Chrome的window.getEventListeners(elemObj)去获取,可是我的还是报错,实在没辙了,用最笨的办法一劳永逸吧,懒人有懒人的办法,这样不就好多了嘛

重新封装全局绑定事件和移除事件方法

function addEvent(obj, type, callback, useCapture=false) {
    obj.addEventListener(type, callback, useCapture);
    addEventList(obj, type, callback, useCapture);
}

function removeEvent (obj, type, callback, useCapture=false) {
    obj.removeEventListener(type, callback, useCapture);
    removeEventList(obj, type, callback, useCapture);
}

function addEventList(obj, type, callback, useCapture=false) {
    if (obj.eventList) {
        if (obj.eventList[type]) {
            obj.eventList[type].push({ callback: callback, useCapture: useCapture });
        } else {
            obj.eventList[type] = [{ callback: callback, useCapture: useCapture }];
        }
    } else {
        obj.eventList = {};
        obj.eventList[type] = [{ callback: callback, useCapture: useCapture }];
    }
}

function removeEventList(obj, type, callback, useCapture=false) {
    let eventList=obj.eventList;
    if (eventList) {
        if (eventList[type]) {            
            for (let i = 0; i < eventList[type].length; i++) {
                if (eventList[type][i].callback===callback) {
                    eventList[type].splice(i, 1);
                    if (eventList[type].length===0) {
                        delete eventList[type];
                    }
                    break;
                }
            }
        } 
    } 
}

function hasEvent(obj, type, callback, useCapture=false){
	let flag = false;
	if(obj && obj.eventList){
		let eventList = obj.eventList;
        if(eventList[type]){
            for(let i=0;i<eventList[type].length; i++){
                if(eventList[type][i].callback === callback){
                    flag = true;
                }
            }
        }
    }
    return flag;
}
Object.defineProperty(Vue.prototype, 'addEvent', {
    value: addEvent
});
Object.defineProperty(Vue.prototype, 'removeEvent', {
    value: removeEvent
});
Object.defineProperty(Vue.prototype, 'addEventList', {
    value: addEventList
});
Object.defineProperty(Vue.prototype, 'removeEventList', {
    value: removeEventList
});
Object.defineProperty(Vue.prototype, 'hasEvent', {
    value: hasEvent
});

main.js引入

import './plugins/global.ref';

index.vue

<router-view ref="childElem" :outHeight="this.outHeight"></router-view>
this.addEvent(window, "resize", () => {
    if(this.$refs.childElem.move) this.$refs.childElem.move();
});

子组件:

methods:{
	downMoveFlag(e){
		console.log('downMoveFlag');
    },
    upMoveFlag(){
		console.log('upMoveFlag');
    },
    moveLine(e){
    	console.log('moveLine');
    },
    move() {
        let eventList = this.outObj.eventList?this.outObj.eventList:null;
        if(eventList){
            this.removeEvent(this.outObj,"mousedown",this.downMoveFlag,false);
            this.removeEvent(this.outObj,"mousemove", this.moveLine,false);
            this.removeEvent(this.outObj,"mouseup", this.upMoveFlag,false);
        }
        this.addEvent(this.outObj,"mousedown",this.downMoveFlag,false);
        this.addEvent(this.outObj,"mousemove", this.moveLine,false);
        this.addEvent(this.outObj,"mouseup", this.upMoveFlag,false);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值