Implement a simple on and off method
introduce:
Event object:
funcList: {}, //Save the method bound by delegate
ieFuncList :{} //Save the binding method under ie
The on and off methods in the Event object are called mainly
Event.addEvent, Event.delegateHandle methods
Event.addEvent: Call the underlying addEventListener to add the listening event
Event.delegateHandle: When an event occurs, as the event bubbles up, determine the element of the event delegate, and execute the corresponding callback function.
addEvent / offEvent:
obj.addEventListener(type, fn, false);
obj.removeEventListener(type, fn, false);
Code - Event.js
/** * addEvent * author [email protected] */window.Event = {};var Event = { funcList: {}, //Save the method bound to delegate ieFuncList: {}, //Because the method bound to be saved under ie on: function(obj, selector, type, fn) { if (!obj || !selector) return false; var fnNew = Event.delegateHandle(obj, selector, fn); Event.addEvent(obj, type, fnNew); /* Save the bound method into Event.funcList for unbinding operations later*/ if (!Event.funcList[selector]) { Event.funcList[selector] = {}; } if (!Event.funcList[selector][type]) { Event.funcList[selector][type] = {}; } Event.funcList[selector][type][fn] = fnNew; }, off: function(obj, selector, type, fn) { if (!obj || !selector || !Event.funcList[selector]) { return false; } var fnNew = Event.funcList[selector][type][fn]; if (!fnNew) { return; } Event.offEvent(obj, type, fnNew); Event.funcList[selector][type][fn] = null; }, delegateHandle: function(obj, selector, fn) { /* Implement the conversion method of delegate. The callback function will be executed only when the event bubbles and rises. */ var func = function(event) { var event = event || window.event; var target = event.srcElement || event.target; var parent = target; function contains(item, elmName) { if (elmName.split('#')[1]) { //by id if (item.id && item.id === elmName.split('#')[1]) { return true; } } if (elmName.split('.')[1]) { //by class if (hasClass(item, elmName.split('.')[1])) { return true; } } if (item.tagName == elmName.toUpperCase()) { return true; //by tagname } return false; } while (parent) { /* If the triggered element is a child of the (selector) element. */ if (obj == parent) { return false; //The trigger element is itself} if (contain(parent, selector)) { fn.call(obj, event); return; } parent = parent.parentNode; } }; return func; }, addEvent: function(target, type, fn) { if (!target) return false; var add = function(obj) { if (obj.addEventListener) { obj.addEventListener(type, fn, false); } else { // for ie if (!Event.ieFuncList[obj]) Event.ieFuncList[obj] = {}; if (!Event.ieFuncList[obj][type]) Event.ieFuncList[obj][type] = {}; Event.ieFuncList[obj][type][fn] = function() { fn.apply(obj, arguments); }; obj.attachEvent("on" + type, Event.ieFuncList[obj][type][fn]); } } if (target.length >= 0 && target !== window && !target.tagName) { for (var i = 0, l = target.length; i < l; i++) { add(target[i]) } } else { add(target); } }, offEvent: function(target, type, fn) { if (!target) return false; var remove = function(obj) { if (obj.addEventListener) { obj.removeEventListener(type, fn, false); } else { //for ie if (!Event.ieFuncList[obj] || !Event.ieFuncList[obj][type] || !Event.ieFuncList[obj][type][fn]) { return; } obj.detachEvent("on" + type, Event.ieFuncList[obj][type][fn], false); Event.ieFuncList[obj][type][fn] = {}; } } if (target.length >= 0 && target !== window && !target.tagName) { for (var i = 0, l = target.length; i < l; i++) { remove(target[i]) } } else { remove(target); } },};
Code - DEMO.html
<!DOCTYPE html><html><head><meta charset="utf-8"><title>test</title></head><body><p>Test Event </p><div id=content> <ul> <li><button id="btn1">1</button></li> <li><button id="btn2">2</button></li> <li><button id="btn3">3</button></li> <li><button id="btn4">4</button></li> <li><button id="btn5">5</button></li> </ul><button id="unbind">Unbinding</button></div><p id="text"></p><script src="addEvent.js"></script><script>(function(){ /* Demo demo*/ var $id=function(id) { return document.getElementById(id) || id; } var outer = $id("content"), btn = $id("text"); Event.on(outer,'button',"click",add); Event.on(outer,'#unbind',"click",remove); // Dynamically add a button to see if there is an event response var newbtn = document.createElement("button"); var node = document.createTextNode("new button"); newbtn.appendChild(node); outer.appendChild(newbtn); function add(){ var e = arguments[0] || window.event; var target = e.srcElement || e.target; console.log("target:",target); btn.innerHTML = target.innerHTML + ' ' + e.type; } function remove(){ Event.off(outer,'button',"click",add); Event.off(outer,'#unbind',"click",remove); }})();</script></body></html>