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) }); };