From 537748e4998977890a077cac627669cc0d11a7d4 Mon Sep 17 00:00:00 2001 From: morning-star <26325820+Sight-wcg@users.noreply.github.com> Date: Wed, 5 Jun 2024 20:40:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(lay):=20=E4=BF=AE=E5=A4=8D=20IE8-10=20?= =?UTF-8?q?=E4=B8=AD=20lay.off=20=E6=97=A0=E6=B3=95=E8=A7=A3=E9=99=A4=20la?= =?UTF-8?q?y.on=20=E7=BB=91=E5=AE=9A=E7=9A=84=E4=BA=8B=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20(#1964)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(lay): 修复 IE8-10 中 lay.off 无法解除 lay.on 绑定的事件的问题 * update code * update --- src/modules/lay.js | 72 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/src/modules/lay.js b/src/modules/lay.js index d4c3e3e0..41071b23 100644 --- a/src/modules/lay.js +++ b/src/modules/lay.js @@ -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) }); };