1. 程式人生 > >jQuery原始碼分析之從on方法看bind,delegate,live,one方法一問

jQuery原始碼分析之從on方法看bind,delegate,live,one方法一問

請提前閱讀on方法原始碼分析:點選開啟連結

bind方法原始碼:

	bind: function( types, data, fn ) {
		return this.on( types, null, data, fn );
	}
delegate方法:
delegate: function( selector, types, data, fn ) {
		return this.on( types, selector, data, fn );
	}

one方法:

one: function( types, selector, data, fn ) {
		return this.on( types, selector, data, fn, 1 );
	}
從上面的原始碼看到:

(1)bind方法由於直接繫結事件到呼叫物件上面,所以他的selector就是null,表示不能進行代理,但是on方法可以進行代理!

(2)在jQuery.1.11.1中以前的live方法已經被移除了!

(3)從on函式中的程式碼可以知道,如果給on函式的fn傳遞false,那麼回撥函式就是returnFalse函式!

(4)one方法的最後一個引數是1,通過這個方法繫結的事件只會被執行一次!
(5)回撥函式中this指向當前元素!,也就是currentTarget。apply( matched.elem, args )是在dispatch裡面的原始碼,但是因為這裡用的是apply而不是call,所以直接把args逐個封裝到回撥函式中。這個args只有一個引數args[0]=event所以這裡回撥函式中唯一一個引數就是event,同時可以通過event.data獲取資料,通過delegateTarget獲取代理物件BODY。通過handleObj可以獲取通過add方法新增的事件的所有資訊,也就是通過add方法裡面新增的handleObj所有屬性!同時可以通過currentTarget獲取當前所在的元素!

總之一句話:在該回調函式中可以獲取這個呼叫事件的所有的資訊!

問題1:到底用delegate還是bind方法?

解答:儘量用delegate方法,既快又少佔用記憶體!

如果能夠繫結到document上,那麼有以下優點:

(1)document物件很快就能訪問,而且可以在頁面任何時間點為他新增事件處理程式。也就說,只要可單機的元素出現在頁面上就可以具備適當的功能

(2)只新增一個事件處理程式所需要的DOM引用少,所花的時間更少

(3)整個頁面佔用的記憶體更少,提升頁面效能

(4)事件代理還有一個重要的好處,那就是方便移除事件處理程式防止記憶體洩漏,因為繫結的事件越少,越容易集中移除。同時代理可以代理後面在DOM中動態新增的內容

click,mouseup,keyup,keydown,mousedown,keypress等適合代理!雖然mouseover,mouseout也冒泡,但是代理他們不容易,而且經常需要計算元素的位置,因為元素在本身和子元素之間移動時候也會觸發!

注意:在事件處理程式中刪除按鈕能夠阻止事件冒泡,目標元素在文件中是事件冒泡的前提!

HTML部分:

<div id="father" style="background-color:red;height:100px;">
     <div  style="background-color:yellow;height:50px;" id="child">
	 我是華為
	</div>
</div>
JS部分:
$("#father").delegate("#child","click",function()
	{
	  alert("click");
	});
	var $child= $("#child");
   $child.click(function()
   {
      alert("click child!");
	  //用移除元素看是否影響元素冒泡
	 this.remove();//我們發現把當前元素移除以後,事件不會冒泡到父元素上面!
   });
note:這時候father元素繫結的click事件不會被呼叫,因為child元素已經移除,所以他不再文件中,不滿足冒泡的前提!

相關推薦

jQuery原始碼分析on方法bind,delegate,live,one方法

請提前閱讀on方法原始碼分析:點選開啟連結 bind方法原始碼: bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }delegate方法: delegat

jQuery原始碼分析on方法

測試程式碼1: var data = { id: 5, name: "張三" }; var events = { "mouseenter": function(event){ $(this).html

jQuery原始碼分析parseJSON方法

建議你首先讀一下jQuery正則表示式中的關於或運算子的部分: 原始碼如下: var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|

jQuery原始碼分析$.ajax方法

針對獲取到location.href的相容程式碼: try { ajaxLocation = location.href; } catch( e ) { // Use the href attribute of an A element // since

jQuery原始碼分析offset,position,offsetParent方法以及原始碼中常見的cssHooks,swap程式碼

jQuery.offset.setOffset原始碼分析: setOffset: function( elem, options, i ) { var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSS

【Go 原始碼分析 sort.go 排序演算法的工程實踐

go version go1.11 darwin/amd64file: src/sort/sort.go 排序演算法有很多種類,比如快排、堆排、插入排序等。各種排序演算法各有其優劣性,在實際生產過程中用到的排序演算法(或者說 Sort 函式)通常是由幾種排序演算法組

jquery 原始碼分析Deferred

一、Deferred物件       Deferred物件就是jQuery的回撥函式解決方案。Deferred的物件的含義就是延遲到未來某一個點再執行。它解決了如何處理耗時操作的問題,對那些操作提供了更好的控制      ,以及統一的程式設計介面。 二、用法舉例 var

jQuery原始碼分析jQuery.event.trigger及jQuery.Event十

問題1:jQuery.event.trigger常見呼叫方式有那些? 例項trigger方法 trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger

RocketMQ原始碼分析官方示例窺探:RocketMQ事務訊息實現基本思想

RocketMQ4.3.0版本開始支援事務訊息,後續分享將開始將剖析事務訊息的實現原理。首先從官方給出的Demo例項入手,以此通往RocketMQ事務訊息的世界中。 官方版本未釋出之前,從apache rocketmq第一個版本上線後,程式碼中存在與事務訊息相關的程式碼,例如COMMIT、ROLLBACK、

cocos2D-X原始碼分析cocos2D-X學習OpenGL(20)----模型,網格和材質

       openGL在cocos2d-x中的應用點,呼叫的api基本已經介紹的差不多了,這一篇介紹一些3d遊戲中的概念,它們也和底層有一些關係,也是遊戲中常用的一些封裝。       當我們要在螢幕上繪製簡單的圖形時,我們直接計算點的座標就可以,但是遊戲世界中經常有些複

jQuery原始碼分析jQuery(selector,context)詳解

首先我們給出下面的HTML程式碼: <div id="parent" class="parent"> <div class="child"> child1 </div> <div class="child">

jQuery原始碼分析 $.isEmptyObject和$.isPlainObject的區別以及自己的一些看法

最近一段時間一直在努力的去看jQuery的原始碼,這是一個非常富有挑戰的過程,在這個過程中也收穫頗多,就想把自己在看jQuery原始碼的時候遇到的一些困惑和讀出的一些心得體會總結出來弄成一個jQuery原始碼分析系列分享給大家,希望對大家也能有所幫助。對自己而言也是一份讀完之

jquery原始碼分析jQuery物件初始化

在jquery實際應用中可通過$或jQuery生成jquery物件,如$("#hr_three")可生成jquery物件,jquery是如何做到的呢?jquery載入時,入口為如下匿名方法,(function( global, factory ) {...} ([color=

spark 1.6.0 core原始碼分析9 簡單例子action

這一節以reduce為例講解action操作 首先看submitJob方法,它將我們reduce中寫的處理函式隨JobSubmitted訊息傳遞出去,因為每個分割槽都需要呼叫它進行計算;而resultHandler是指最後合併的方法,在每個task完成後,需要呼叫resul

Yarn原始碼分析MapReduce作業中任務Task排程整體流程(

        v2版本的MapReduce作業中,作業JOB_SETUP_COMPLETED事件的發生,即作業SETUP階段完成事件,會觸發作業由SETUP狀態轉換到RUNNING狀態,而作業狀態轉換中涉及作業資訊的處理,是由SetupCompletedTransition

ArrayList原始碼分析 add 方法

在Java程式設計中,常常需要集中存放多個數據,從傳統意義上講,陣列是我們的一個很好的選擇,前提是我們事先已經明確知道我們將要儲存的物件的數量。一旦在陣列初始化時指定了這個陣列長度,這個陣列長度就是不可變的,如果我們需要儲存一個可以動態增長的資料(在編譯時無法確定具體的數量), List 這個集

JAVA原始碼分析---Object類()---registerNatives,getClass方法的使用

本人java碼農一名,在工作中,萌生了分析java原始碼的想法,從今天開始,一步一步開始分析java原始碼吧。 本人閱讀jdk原始碼版本為jdk1.7。 既然是Java,那麼肯定要從最頂層的Object類開始分析。      Object全稱:java.lang.Objec

String原始碼分析equals和hashcode方法

1.說明 == :如果是非引用型別,則值相等;引用型別,則地址相同,也就是指向堆中相同的物件 equals:Object物件而言或者沒有重寫equals方法的類,等效於==;重寫了equals方法則按子類的方法來比較 2.String的equals方法

Android原始碼分析模板方法模式

模式的定義 定義一個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 使用場景1、多個子類有公有的方法,並且邏輯基本相同時。2、重要、複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細節功能則由各個子

Spring原始碼分析BeanPostProcessor介面和BeanFactoryPostProcessor介面方法不執行原因分析

首先下面是我的Bean /* * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License