事件系统
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)...