<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        自己封裝的javascript事件隊(duì)列函數(shù)版_javascript技巧

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:24:32
        文檔

        自己封裝的javascript事件隊(duì)列函數(shù)版_javascript技巧

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

        背景

        javascript中使用addEventListener()或attachEvent()綁定事件時(shí)會(huì)有幾個(gè)小問題:

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

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

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

        oBtn.reomveEventListener('click',function(){
        alert('button is clicked')
        },false)
        //oBtn上的事件無法移除,因?yàn)閭魅氲氖且粋€(gè)匿名函數(shù)
        二、ie6-ie8中,使用attachEvent()綁定多個(gè)事件的倒序執(zhí)行問題。
        代碼如下:
        var oBtn = document.getElementById('btn');

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

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

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

        解決問題

        我想寫一個(gè)跨瀏覽器的事件綁定模塊,這樣以后可以復(fù)用,同時(shí)我想解決上訴問題。JQuery內(nèi)部使用事件隊(duì)列和數(shù)據(jù)緩存機(jī)制解決此問題,看了下相關(guān)源碼,實(shí)在復(fù)雜,自個(gè)試了一些方法,勉強(qiáng)實(shí)現(xiàn)。貼段代碼,原來是用面向?qū)ο髮懙模幌胱屓丝吹煤軓?fù)雜,所有改成函數(shù)來組織。
        代碼如下:
        /*綁定事件的接口
        *
        *@param {dom-DOM}和{type-string}和{fn-function} 可選參數(shù){fnName-string}
        *@execute 創(chuàng)建事件隊(duì)列,添加到DOM對象屬性上,
        將事件處理程序(函數(shù))加入事件隊(duì)列
        可為事件處理程序添加一個(gè)標(biāo)識符,用于刪除指定事件處理程序
        */
        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用于遍歷執(zhí)行事件隊(duì)列中的事件處理程序(函數(shù))
        *@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} 可選參數(shù){fnName-function}
        *@execute 如果沒有標(biāo)識符,則執(zhí)行unBindEvent()
        如果有標(biāo)識符,則刪除指定事件處理程序,如果事件隊(duì)列長度為0,執(zhí)行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,并清空事件隊(duì)列
        *@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];
        };

        /*判斷事件隊(duì)列長度
        *
        *@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同時(shí)綁定三個(gè)click事件函數(shù)
        //ie6-ie8下執(zhí)行順序不變
        bind(oBtn,'click',function(){
        alert(1);
        })
        bind(oBtn,'click',function(){
        alert(2);
        },'myFn')
        bind(oBtn,'click',function(){
        alert(3);
        })

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

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

        程序思路

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

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

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

        每次先把事件函數(shù)添加到對應(yīng)事件類型的事件隊(duì)列中,只綁定一次事件。觸發(fā)事件時(shí)執(zhí)行handler事件函數(shù),handler則遍歷執(zhí)行事件隊(duì)列中的事件函數(shù)。

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

        程序邏輯并不復(fù)雜,可能有bug和性能問題,有興趣可以指導(dǎo)交流下。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        自己封裝的javascript事件隊(duì)列函數(shù)版_javascript技巧

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲熟妇少妇任你躁在线观看| 亚洲中文字幕无码永久在线| 亚洲精品一区二区三区四区乱码| 拍拍拍无挡免费视频网站| 久久亚洲国产精品五月天婷| 一道本在线免费视频| 久久久精品国产亚洲成人满18免费网站| 美景之屋4在线未删减免费 | 亚洲av高清在线观看一区二区| 偷自拍亚洲视频在线观看| 亚洲?V无码成人精品区日韩| 午夜不卡AV免费| 亚洲色爱图小说专区| 久久久久国产精品免费免费不卡 | 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 久久精品国产亚洲av水果派| 性xxxxx免费视频播放| 亚洲精品无码久久久久秋霞 | 国产精品免费看久久久| 亚洲精品在线播放| 成年女人免费视频播放体验区| 最新亚洲人成无码网站| 区久久AAA片69亚洲| 人妻无码久久一区二区三区免费 | 亚洲成电影在线观看青青| 成人午夜性A级毛片免费| 国产精品亚洲专区一区| 亚洲精品中文字幕乱码三区| 亚洲免费网站在线观看| 亚洲aⅴ天堂av天堂无码麻豆| 免费日本黄色网址| 国产免费AV片在线观看| ass亚洲**毛茸茸pics| 免费播放春色aⅴ视频| 无码精品一区二区三区免费视频| 亚洲成a人片在线观看精品| 亚洲日本一区二区三区在线不卡| 99精品国产成人a∨免费看| 亚洲精品乱码久久久久久V | 亚洲精品二三区伊人久久| 亚洲成av人片天堂网老年人|