关注开源代码的实际应用
Dean Edwards实现的Javascript Events管理:http://dean.edwards.name/weblog/2005/10/add-event/。特性:
addeventListener/attachEvent methodsthis keyword)
- // written by Dean Edwards, 2005
- // http://dean.edwards.name/
- function addEvent(element, type, handler) {
- // assign each event handler a unique ID
- if (!handler.$guid) handler.$guid = addEvent.guid++;
- // create a hash table of event types for the element
- if (!element.events) element.events = {};
- // create a hash table of event handlers for each element/event pair
- var handlers = element.events[type];
- if (!handlers) {
- handlers = element.events[type] = {};
- // store the existing event handler (if there is one)
- if (element["on" + type]) {
- handlers[0] = element["on" + type];
- }
- }
- // store the event handler in the hash table
- handlers[handler.$guid] = handler;
- // assign a global event handler to do all the work
- element["on" + type] = handleEvent;
- };
- // a counter used to create unique IDs
- addEvent.guid = 1;
- function removeEvent(element, type, handler) {
- // delete the event handler from the hash table
- if (element.events && element.events[type]) {
- delete element.events[type][handler.$guid];
- }
- };
- function handleEvent(event) {
- // grab the event object (IE uses a global event object)
- event = event || window.event;
- // get a reference to the hash table of event handlers
- var handlers = this.events[event.type];
- // execute each event handler
- for (var i in handlers) {
- this.$handleEvent = handlers[i];
- this.$handleEvent(event);
- }
- };
下面是一个改进版(防止内存泄漏):
- function addEvent(element, type, handler) {
- // assign each event handler a unique ID
- if (!handler.$guid) handler.$guid = addEvent.guid++;
- // assign each element a unique ID
- if (!element.$guid) element.$guid = addEvent.guid++;
- // create a hash table of event types for the element
- if (!addEvent.handlers[element.$guid]) addEvent.handlers[element.$guid] = {};
- // create a hash table of event handlers for each element/event pair
- var handlers = addEvent.handlers[element.$guid][type];
- if (!handlers) {
- handlers = addEvent.handlers[element.$guid][type] = {};
- // store the existing event handler (if there is one)
- if (element["on" + type]) {
- handlers[0] = element["on" + type];
- }
- }
- // store the event handler in the hash table
- handlers[handler.$guid] = handler;
- // assign a global event handler to do all the work
- element["on" + type] = handleEvent;
- };
- // a counter used to create unique IDs
- addEvent.guid = 1;
- // a global hash table containing all handlers
- addEvent.handlers = {};
- function removeEvent(element, type, handler) {
- // check if the element has a guid
- if (!element.$guid) return;
- // delete the event handler from the hash table
- if (addEvent.handlers[element.$guid] && addEvent.handlers[element.$guid][type]) {
- delete addEvent.handlers[element.$guid][type][handler.$guid];
- }
- };
- function handleEvent(event) {
- // grab the event object (IE uses a global event object)
- event = event || window.event;
- // get a reference to the hash table of event handlers
- var handlers = addEvent.handlers[this.$guid][event.type];
- // execute each event handler
- for (var i in handlers) {
- this.$handleEvent = handlers[i];
- this.$handleEvent(event);
- }
- };