fix(lay): 修复 IE8-10 中 lay.off 无法解除 lay.on 绑定的事件的问题 (#1964)

* fix(lay): 修复 IE8-10 中 lay.off 无法解除 lay.on 绑定的事件的问题

* update code

* update
pull/1986/head
morning-star 2024-06-05 20:40:54 +08:00 committed by GitHub
parent ea1693dd32
commit 537748e499
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 63 additions and 9 deletions

View File

@ -617,6 +617,65 @@
targetElem.addEventListener('touchstart', onStart);
}
/** @type {(elem: Element|Document|Window,eventName: string,fn:EventListenerOrEventListenerObject,options: boolean | AddEventListenerOptions) => any}*/
lay.addEvent = function(){
if(document.addEventListener){
return function(elem, eventName, fn, options){
elem.addEventListener(eventName, fn, options);
}
}else{
return function(elem, eventName, fn){
var prefix = '_lay_on_';
var eventsCacheName = prefix + eventName;
var listener = function(e){
e.target = e.srcElement;
fn.call(elem, e);
}
listener._rawFn = fn;
if(!elem[eventsCacheName]){
elem[eventsCacheName] = [];
}
var include = false;
lay.each(elem[eventsCacheName], function(_, listener){
if(listener._rawFn === fn){
include = true;
return true;
}
})
if(!include){
elem[eventsCacheName].push(listener);
elem.attachEvent('on' + eventName, listener);
}
}
}
}();
/** @type {(elem: Element|Document|Window,eventName: string,fn:EventListenerOrEventListenerObject,options: boolean | EventListenerOptions) => any}*/
lay.removeEvent = function(){
if(document.removeEventListener){
return function(elem, eventName, fn, options){
elem.removeEventListener(eventName, fn, options);
}
}else{
return function(elem, eventName, fn){
var prefix = '_lay_on_';
var eventsCacheName = prefix + eventName;
var events = elem[eventsCacheName];
if(layui.isArray(events)){
var newEvents = [];
lay.each(events, function(_, listener){
if(listener._rawFn === fn){
elem.detachEvent('on'+ eventName, listener);
}else{
newEvents.push(listener);
}
})
elem[eventsCacheName] = newEvents;
}
}
}
}();
/*
* lay 元素操作
@ -784,21 +843,16 @@
};
// 事件绑定
Class.fn.on = function(eventName, fn){
Class.fn.on = function(eventName, fn, options){
return this.each(function(index, item){
item.attachEvent ? item.attachEvent('on' + eventName, function(e){
e.target = e.srcElement;
fn.call(item, e);
}) : item.addEventListener(eventName, fn, false);
lay.addEvent(item, eventName, fn, options)
});
};
// 解除事件
Class.fn.off = function(eventName, fn){
Class.fn.off = function(eventName, fn, options){
return this.each(function(index, item){
item.detachEvent
? item.detachEvent('on'+ eventName, fn)
: item.removeEventListener(eventName, fn, false);
lay.removeEvent(item, eventName, fn, options)
});
};