<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我是FE,也是Fe

    前端來源于不斷的點(diǎn)滴積累。我一直在努力。

    統(tǒng)計(jì)

    留言簿(15)

    閱讀排行榜

    評(píng)論排行榜

    jQuery中的delegate與live實(shí)現(xiàn)方式簡析

    delegatelive方法是jQuery在1.4版本中新增的方法。他的作用是事件監(jiān)聽,但是可以對(duì)jQuery對(duì)象中新增的DOM對(duì)象也作用:

    <script>
        $(
    "body").delegate("p""click"function(){
          $(
    this).after("<p>Another paragraph!</p>");
        });
    </script>

    上面的這個(gè)demo運(yùn)行效果就是點(diǎn)擊一個(gè)段落P標(biāo)簽將在p標(biāo)簽后面添加一個(gè)p標(biāo)簽,對(duì)于新增的p標(biāo)簽同樣可以點(diǎn)擊新增一個(gè)p標(biāo)簽,新增的標(biāo)簽不需要監(jiān)聽其click事件。live也同理:


        $(
    "p").live("click"function(){
          $(
    this).after("<p>Another paragraph!</p>");
        });

    這個(gè)是怎么實(shí)現(xiàn)的了?我自己嘗試了一把:首先必須了解事件的冒泡機(jī)制。下面的例子將在按鈕 和其容器上同時(shí)監(jiān)聽click事件,根據(jù)冒泡的做法,將先觸發(fā)按鈕的click事件,然后觸發(fā)容器div的click事件。

    window.onload = function(){
                
    function handle(e){
                    
    //獲取event對(duì)象
                    //標(biāo)準(zhǔn)DOM方法事件處理函數(shù)第一個(gè)參數(shù)是event對(duì)象
                    //IE可以使用全局變量window.event
                    var evt = window.event?window.event:e;

                    
    //獲取觸發(fā)事件的原始事件源
                    //標(biāo)準(zhǔn)DOM方法是用target獲取當(dāng)前事件源
                    //IE使用evt.srcElement獲取事件源
                    var target = evt.target||evt.srcElement;

                    
    //獲取當(dāng)前正在處理的事件源
                    //標(biāo)準(zhǔn)DOM方法是用currentTarget獲取當(dāng)前事件源
                    //IE中的this指向當(dāng)前處理的事件源
                    var currentTarget= e?e.currentTarget:this;

                    
    //問題:在IE 9下  window.event 與 e 不同 evt沒有currentTarget屬性,e才有currentTarget屬性(視為標(biāo)準(zhǔn)瀏覽器做法??)
                    alert("src id:"+target.id+"\ncurent target id :"+currentTarget.id);

                    
                }
                document.getElementById(
    "btn").onclick=handle;
                document.getElementById(
    "c").onclick= handle;
                
            }
    <div id="c" class="">
        
    <input type="button" id="btn" name="" value="button"  />
    </div>

    問題在于處理容器c的click事件是由冒泡觸發(fā)的。需要找到真正觸發(fā)事件的事件源按鈕btn。標(biāo)準(zhǔn)瀏覽器的event提供了currentTarget屬性獲取原始事件源。否標(biāo)準(zhǔn)瀏覽器IE6/7/8可以直接使用this訪問。這樣div的click事件中可以獲取到真正觸發(fā)事件的事件源。

    //ps:上面的代碼中有個(gè)發(fā)現(xiàn):在調(diào)試的時(shí)候發(fā)現(xiàn)IE 9中的e 和全局變量window.event有區(qū)別,IE 9的e的設(shè)置完全是按照標(biāo)準(zhǔn)瀏覽器來的。所以e也提供了currentTarget屬性。下面是我調(diào)試時(shí)候的發(fā)現(xiàn):

     

    其實(shí)只要能獲取到冒泡的原始事件源,對(duì)于新增的元素,我們通過監(jiān)聽其父容器事件,然后根據(jù)原始事件是否是新增元素,就可以觸發(fā)新增元素的事件。這就是所謂的“代理(delegate)”,就是通過容器(未必是父容器)的事件監(jiān)聽代理新元素的事件。下面用一個(gè)超鏈接新增一個(gè)按鈕并且在不監(jiān)聽其事件情況下通過事件冒泡捕獲其事件。

    window.onload = function(){
                
    function handle(e){
                    
    //獲取event對(duì)象
                    //標(biāo)準(zhǔn)DOM方法事件處理函數(shù)第一個(gè)參數(shù)是event對(duì)象
                    //IE可以使用全局變量window.event
                    var evt = window.event?window.event:e;

                    
    //獲取觸發(fā)事件的原始事件源
                    //標(biāo)準(zhǔn)DOM方法是用target獲取當(dāng)前事件源
                    //IE使用evt.srcElement獲取事件源
                    var target = evt.target||evt.srcElement;

                    
    //獲取當(dāng)前正在處理的事件源
                    //標(biāo)準(zhǔn)DOM方法是用currentTarget獲取當(dāng)前事件源
                    //IE中的this指向當(dāng)前處理的事件源
                    var currentTarget= e?e.currentTarget:this;

                    
    //問題:在IE 9下  window.event 與 e 不同 evt沒有currentTarget屬性,e才有currentTarget屬性(視為標(biāo)準(zhǔn)瀏覽器做法??)
                    alert("src id:"+target.id+"\ncurent target id :"+currentTarget.id);

                    
    if(target.id=="newbutton"){
                        alert(
    "觸發(fā)新增元素的delegate方法");
                    }

                }

                document.getElementById(
    "btn").onclick=handle;
                document.getElementById(
    "c").onclick= handle;


                document.getElementById(
    "btnadd").onclick=function(){
                    
    var btn = document.createElement("input");
                    btn.setAttribute(
    "value","點(diǎn)擊我試試");
                    btn.setAttribute(
    "type","button");
                    btn.setAttribute(
    "id","newbutton");
                    
    //沒有監(jiān)聽新按鈕的onclick事件
                    document.getElementById("c").appendChild(btn);
                }

            }
    <div id="c" class="">
        
    <input type="button" id="btn" name="" value="button"  />
    </div>
    <href="###" id="btnadd">添加一個(gè)按鈕</a>

    新增的按鈕同樣能監(jiān)聽到其click方法,只是使用其父容器代理click事件在代理新按鈕的click事件

    上面的分析也能說明為什么delegate的性能會(huì)比live要好。因?yàn)閘ive是通過document.body的事件代理了新元素的事件。delegate指定了事件代理的夫容器,這樣事件冒泡的層次會(huì)少,性能表現(xiàn)會(huì)好。

     

    posted on 2011-04-19 12:07 衡鋒 閱讀(4760) 評(píng)論(3)  編輯  收藏 所屬分類: javascriptWeb開發(fā)

    評(píng)論

    # re: jQuery中的delegate與live實(shí)現(xiàn)方式簡析 2011-04-20 15:37 網(wǎng)購打折促銷信息

    最近正在學(xué)jquery,多謝分享。  回復(fù)  更多評(píng)論   

    # re: jQuery中的delegate與live實(shí)現(xiàn)方式簡析 2011-04-21 15:02 好看的電影

    感覺有點(diǎn)難度  回復(fù)  更多評(píng)論   

    # re: jQuery中的delegate與live實(shí)現(xiàn)方式簡析 2011-09-16 08:23 tb

    多謝分享  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 亚洲av无码成人精品区在线播放| 国产精品免费观看| 亚洲av无码乱码在线观看野外 | 中文字幕在线观看亚洲| 久久精品电影免费动漫| 亚洲国产精品热久久| 国产精品免费高清在线观看| 久久久亚洲精品国产| 在线a免费观看最新网站| 亚洲乱码一二三四区国产| 国产成人无码免费看视频软件| 国产v亚洲v天堂a无| 成人免费无遮挡无码黄漫视频| 久久久久亚洲国产AV麻豆| 免费人成网站在线播放| a免费毛片在线播放| 中文字幕在线亚洲精品 | 一级人做人爰a全过程免费视频| 亚洲片一区二区三区| 久久免费国产精品一区二区| 亚洲精选在线观看| 成人毛片免费观看视频大全| 免费人人潮人人爽一区二区 | 亚洲国产精品一区| 国产精品美女午夜爽爽爽免费 | 手机看片国产免费永久| 亚洲美女视频网站| 日韩一区二区在线免费观看 | WWW免费视频在线观看播放| 久久精品亚洲综合| 国产精品视频免费一区二区| 免费人成又黄又爽的视频在线电影| 黑人精品videos亚洲人| 国产91免费在线观看| 美女被艹免费视频| 亚洲黄色免费观看| 可以免费观看的一级毛片| 久久午夜免费鲁丝片| 色五月五月丁香亚洲综合网| 亚洲无人区一区二区三区| 成年在线网站免费观看无广告|