最後,經過測試&錯誤的時間我已經找到了解決辦法,也許它不是最好的,最有效的。但它作品! (測試IE9,Firefox 12,Chrome 18)
首先我們創建兩個跨瀏覽器和輔助的addEvent()和removeEvent()方法。 (來自Jquery源代碼的想法!)
HELPERS.removeEvent = document.removeEventListener ?
function(type, handle,el) {
if (el.removeEventListener) {
//W3C Standard
el.removeEventListener(type, handle, true);
}
} :
function(type, handle,el) {
if (el.detachEvent) {
//The IE way
el.detachEvent('on'+type, el[type+handle]);
el[type+handle] = null;
}
};
HELPERS.addEvent = document.addEventListener ?
function(type, handle,el) {
if (el.addEventListener) {
//W3C Standard
el.addEventListener(type, handle, true);
}
} :
function(type, handle,el) {
if (el.attachEvent) {
//The IE way
el['e'+type+handle] = handle;
el[type+handle] = function(){
handle.call(el,window.event);
};
el.attachEvent('on'+type, el[type+handle]);
}
}
同時,我們也需要一些「容器」來存儲連接事件的元素,像這樣:
HELPERS.EVTS = {};
最後兩個調用並暴露用戶的方法: 下一個添加事件(事件)並將該事件關聯到特定元素(el)的方法(處理程序)。
function bindEvent(event, handler,el) {
if(!(el in HELPERS.EVT)) {
// HELPERS.EVT stores references to nodes
HELPERS.EVT[el] = {};
}
if(!(event in HELPERS.EVT[el])) {
// each entry contains another entry for each event type
HELPERS.EVT[el][event] = [];
}
// capture reference
HELPERS.EVT[el][event].push([handler, true]);
//Finally call the aux. Method
HELPERS.addEvent(event,handler,el);
return;
}
最後,對於一個特定元素(EL)每一個預安裝的事件(事件)
function removeAllEvent(event,el) {
if(el in HELPERS.EVT) {
var handlers = HELPERS.EVT[el];
if(event in handlers) {
var eventHandlers = handlers[event];
for(var i = eventHandlers.length; i--;) {
var handler = eventHandlers[i];
HELPERS.removeEvent(event,handler[0],el);
}
}
}
return;
}
未連接順便說一句,調用這個方法,你必須執行以下操作方法: 捕獲一個DOM節點
var a = document.getElementById('some_id');
調用方法 'bindEvent()' 與相應的參數。
bindEvent('click',function(){alert('say hi');},a);
並以去其附加:
removeAllEvent('click',a);
這一切,希望將某人1天有用。
你從哪裏得到'bindEvent()'?它有什麼作用? – jfriend00 2012-04-20 22:37:19
你是否要求一個非基於jQuery的答案(例如純javascript)? – jfriend00 2012-04-20 22:38:32
@ jfriend00:他想自己實現 - 例如。他不使用jQuery,而是問jQuery如何做。 – prodigitalson 2012-04-20 22:38:45