国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

自己封裝的javascript事件隊列函數版_javascript技巧

來源:懂視網 責編:小采 時間:2020-11-27 21:24:32
文檔

自己封裝的javascript事件隊列函數版_javascript技巧

自己封裝的javascript事件隊列函數版_javascript技巧:背景 javascript中使用addEventListener()或attachEvent()綁定事件時會有幾個小問題: 一、使用addEventListener()或attachEvent()添加的匿名函數無法移除。 代碼如下:var oBtn = document.getElementById('btn');o
推薦度:
導讀自己封裝的javascript事件隊列函數版_javascript技巧:背景 javascript中使用addEventListener()或attachEvent()綁定事件時會有幾個小問題: 一、使用addEventListener()或attachEvent()添加的匿名函數無法移除。 代碼如下:var oBtn = document.getElementById('btn');o

背景

javascript中使用addEventListener()或attachEvent()綁定事件時會有幾個小問題:

一、使用addEventListener()或attachEvent()添加的匿名函數無法移除。

代碼如下:var oBtn = document.getElementById('btn');

oBtn.addEventListener('click',function(){
alert('button is clicked')
},false)

oBtn.reomveEventListener('click',function(){
alert('button is clicked')
},false)
//oBtn上的事件無法移除,因為傳入的是一個匿名函數
二、ie6-ie8中,使用attachEvent()綁定多個事件的倒序執行問題。
代碼如下:
var oBtn = document.getElementById('btn');

oBtn.attachEvent('onclick',function(){
alert(1)
})

oBtn.attachEvent('onclick',function(){
alert(2)
})

oBtn.attachEvent('onclick',function(){
alert(3)
})
//ie9+ 下執行順序1、2、3
//ie6-ie8下執行順序3、2、1

解決問題

我想寫一個跨瀏覽器的事件綁定模塊,這樣以后可以復用,同時我想解決上訴問題。JQuery內部使用事件隊列和數據緩存機制解決此問題,看了下相關源碼,實在復雜,自個試了一些方法,勉強實現。貼段代碼,原來是用面向對象寫的,不想讓人看得很復雜,所有改成函數來組織。
代碼如下:
/*綁定事件的接口
*
*@param {dom-DOM}和{type-string}和{fn-function} 可選參數{fnName-string}
*@execute 創建事件隊列,添加到DOM對象屬性上,
將事件處理程序(函數)加入事件隊列
可為事件處理程序添加一個標識符,用于刪除指定事件處理程序
*/
function bind(dom,type,fn,fnName){
dom.eventQueue = dom.eventQueue || {};
dom.eventQueue[type] = dom.eventQueue[type] || {};
dom.handler = dom.handler || {};

if (!fnName) {
var index = queueLength(dom,type);
dom.eventQueue[type]['fnQueue'+index] = fn;
}
else {
dom.eventQueue[type][fnName] = fn;
};

if (!dom.handler[type]) bindEvent(dom,type);
};

/*綁定事件
*
*@param {dom-DOM}和{type-string}
*@execute 只綁定一次事件,handler用于遍歷執行事件隊列中的事件處理程序(函數)
*@caller bind()
*/
function bindEvent(dom,type){
dom.handler[type] = function(){
for(var guid in dom.eventQueue[type]){
dom.eventQueue[type][guid].call(dom);
}
};

if (window.addEventListener) {
dom.addEventListener(type,dom.handler[type],false);
}
else {
dom.attachEvent('on'+type,dom.handler[type]);
};
};

/*移除事件的接口
*
*@param {dom-DOM}和{type-string} 可選參數{fnName-function}
*@execute 如果沒有標識符,則執行unBindEvent()
如果有標識符,則刪除指定事件處理程序,如果事件隊列長度為0,執行unBindEvent()
*/
function unBind(dom,type,fnName){
var hasQueue = dom.eventQueue && dom.eventQueue[type];
if (!hasQueue) return;
if (!fnName) {
unBindEvent(dom,type)
}
else {
delete dom.eventQueue[type][fnName];
if (queueLength(dom,type) == 0) unBindEvent(dom,type);
};
};

/*移除事件
*
*@param {dom-DOM}和{type-string}
*@execute 移除綁定的事件處理程序handler,并清空事件隊列
*@caller unBind()
*/
function unBindEvent(dom,type){
if (window.removeEventListener) {
dom.removeEventListener(type,dom.handler[type])
}
else {
dom.detachEvent(type,dom.handler[type])
}

delete dom.eventQueue[type];
};

/*判斷事件隊列長度
*
*@param {dom-DOM}和{type-string}
*@caller bind() unBind()
*/
function queueLength(dom,type){
var index = 0;
for (var length in dom.eventQueue[type]){
index++ ;
}
return index;
};

使用方法

代碼如下:
var oBtn = document.getElementById('btn');

//綁定事件
//為button同時綁定三個click事件函數
//ie6-ie8下執行順序不變
bind(oBtn,'click',function(){
alert(1);
})
bind(oBtn,'click',function(){
alert(2);
},'myFn')
bind(oBtn,'click',function(){
alert(3);
})

//移除事件
//移除所有綁定的click事件函數,支持移除匿名函數
unBind(oBtn,'click')

//只移除標識符為myfn的事件函數
unBind(oBtn,'click','myFn')

程序思路

程序主要思路就像將事件隊列作為dom元素對象的一個屬性,添加在dom元素上,而不會污染全局環境,這樣可以解決不同dom元素綁定不同事件類型的多個事件函數的數據存儲問題。

代碼如下:
//dom元素上的事件隊列
dom{
eventQueue : {
'click' : {
fnQueue1 : function,
myfn : function,
fnQueue3 : function
}

'mouseover' : {
fnQueue1 : function,
fnQueue2 : function
}
}
}

每次先把事件函數添加到對應事件類型的事件隊列中,只綁定一次事件。觸發事件時執行handler事件函數,handler則遍歷執行事件隊列中的事件函數。

unBind()如果沒有傳入標識符,則移除所有綁定的事件函數,支持移除匿名函數,如果有標識符則移除指定的事件函數。

程序邏輯并不復雜,可能有bug和性能問題,有興趣可以指導交流下。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

自己封裝的javascript事件隊列函數版_javascript技巧

自己封裝的javascript事件隊列函數版_javascript技巧:背景 javascript中使用addEventListener()或attachEvent()綁定事件時會有幾個小問題: 一、使用addEventListener()或attachEvent()添加的匿名函數無法移除。 代碼如下:var oBtn = document.getElementById('btn');o
推薦度:
標簽: 事件 js 函數
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 亚洲国产精品视频 | 日韩视频免费在线观看 | 亚洲欧美中文字幕 | 久久久久久久亚洲精品 | 韩国精品一区 | 亚洲欧洲第一页 | 国产在线一区二区三区四区 | 日韩一级精品视频在线观看 | 欧美亚洲网| 麻豆porn| 国产一区二区三区日韩欧美 | 久久精品亚洲一区二区 | 欧美一区二区二区 | 国产中文字幕在线 | 日韩小视频在线观看 | 国产精品国产亚洲精品看不卡 | 国产精品久久久久久永久牛牛 | 国产成人精品999在线观看 | 国产精品免费观在线 | 亚洲三区视频 | 国产在线看不卡一区二区 | 日韩一二三 | 国产网站精品 | 欧美日韩国产一区二区三区播放 | 亚洲精品午夜国产va久久成人 | 亚洲欧美日韩三级 | 亚洲一区二区综合 | 国产区二区 | 国产在线观看中文字幕 | 亚洲欧美在线观看视频 | 国内精品91久久久久 | 欧美视频精品一区二区三区 | 日韩视频中文字幕专区 | 亚洲最新在线 | 精品一区二区三区四区 | 亚洲欧美高清 | 国产成人精品一区二三区2022 | 99久久精品国产综合一区 | 日韩在线第二页 | 欧美人与动性xxxxx杂性 | www.亚洲一区|