jquery on方法(事件委托)


jquery綁定事件處理函數的方法有好幾個,比如:bind(),on(),delegate(),live()。

其中delegate和live都是用on實現的,效果也類似,live好像在1.7版本中已經廢棄了。

這里重點看看on的用法:

$(el).on( events [, selector ] [, data ], handler(eventObject) )

如果省略了selector參數,on方法和bind方法效果一樣。

 

如果傳遞了參數selector,其實就生成了一個“事件委托”。

什么是“事件委托”呢?

我們知道瀏覽器事件傳播時經歷了三個過程:捕獲階段 、目標階段 和 冒泡階段。

事件捕獲是指事件從document到觸發事件的目標對象(event.target)的過程;

事件冒泡是指從觸發事件的目標對象(event.target)到document的過程。

當我們點擊一個元素的時候,除了會觸發該元素的click事件,也會冒泡觸發其祖先元素的click事件(包括document)。

利用這一特性,我們可以直接在一個元素(比如document)上綁定一個事件處理函數來處理該元素所有子孫元素的該事件,當然,這里一般會在處理函數里判斷event.target,根據觸發事件的目標對象不同進行不同的操作。這一過程就叫事件委托。

 

on方法傳遞了參數selector時就構成了一個上面這樣的事件委托,關於selector參數的介紹jquery文檔中描述的不是很清楚,看網上很多文章關於這塊都理解的有點偏差,所以寫代碼測試了一下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jquery on方法</title>
<script src="http://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js"></script>
</head>
<body>
<div style="position:relative;width:800px;height:600px;margin:0 auto;background-color:lightblue;">
    <div id="middle" style="position:absolute;top:50%;left:50%;width:600px;height:400px;margin:-200px 0 0 -300px;background-color:blue;">
        <div id="inter" style="position:absolute;top:50%;left:50%;width:400px;height:200px;margin:-100px 0 0 -200px;background-color:darkblue;">
            <div id="innter" style="position:absolute;top:50%;left:50%;width:200px;height:100px;margin:-50px 0 0 -100px;background-color:black;">

            </div>
        </div>
    </div>
</div>


<script>
$(function(){
    $("div").on(
        "click",
        "#inter",
        {o1:'hi',o2:'jquery'},
        function(e){
            console.log(this,e.data);
            //e.stopPropagation();
        }
    );
});
</script>
</body>
</html>

測試用例中用了4個嵌套的div,用on方法給div元素綁定click事件的處理函數,其中selector參數傳遞的為“#inter”,點擊#outer和#middle時沒有結果輸出,當點擊#inter或#innter時執行結果都為:

根據事件冒泡的順序和div的層數我們可以分析出每次的兩行輸出都是#middle和#outer兩個div的click事件處理函數執行的結果。

 

綜合分析得出:

如果on方法傳遞了selector參數(且不為null),只有當selector是el的子孫元素,且觸發事件的元素是selector或者selector的子孫元素時,才會觸發綁定在el上的事件處理函數。

 

最后順便一提,取消用on綁定的事件處理函數的方法是off()。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM