事件系统

by 苹果熊

HTML

<div id="test1"><p>点我1</p></div>
<div id="loading" style="display: none">加载中...</div>

JavaScript

function ready(fn) {
	window.addEventListener ? window.addEventListener('DOMContentLoaded', fn, false) : window.onload = fn
}

function elem(id) {
	return document.getElementById(id)
}

;(function() {
	var cache = {},
		guidCounter = 1,
		expando = '_v' + new Date().getTime()

	this.getData = function(elem) {
		var guid = elem[expando]
		if(!guid) {
			guid = elem[expando] = guidCounter++
			cache[guid] = {}
		}
		return cache[guid]
	}
	window.cache = cache

	this.removeData = function(elem) {
		var guid = elem[expando]
		if(!guid) return
		delete cache[guid]
		try {
			delete elem[expando]
		} catch(e) {
			if(elem.removeAttribute) {
				elem.removeAttribute('expando')
			}
		}
	}
})()

;(function() {
	var nextGuid = 1
	HTMLElement.prototype.on = function(type, fn) {
  console.log(1)
		var self = this
		var data = getData(self)

		if(!data.handlers) {
			data.handlers = {}
		}
		if(!data.handlers[type]) {
			data.handlers[type] = []
		}
		if(!fn.guid) {
			fn.guid = nextGuid++
		}

		data.handlers[type].push(fn)

		if(!data.dispatcher) {
			data.disabled = false
			data.dispatcher = function(event) {
				if(data.disabled) {
					return
				}
				if(!data.handlers || !data.handlers[event.type]) {
					return
				}
				var handlers = data.handlers[event.type]
				if(handlers) {
					for(var n = 0; n < handlers.length; n++) {
						handlers[n].call(self, event)
					}
				}
			}
		}

		if(data.handlers[type].length == 1) {
			if(document.addEventListener) {
				self.addEventListener(type, data.dispatcher, false)
			} else if(document.attachEvent) {
				self.attachEvent('on' + type, data.dispatcher)
			}
		}
	}
	HTMLElement.prototype.off = function(type, fn) {
		var self = this
		var data = getData(self)

		if(!data.handlers) {
			return
		}

		var removeType = function(t) {
			data.handlers[t] = []
			tidyUp(self, t)
		}

		if(!type) {
			for(var t in data.handlers) {
				removeType(t)
			}
			return
		}
		var handlers = data.handlers[type]
		if(!handlers)...