第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

章節(jié)
問答
課簽
筆記
評論
占位
占位

綁定設(shè)計(jì)

提到j(luò)Query的事件,不得不提一下 Dean Edwards大神 addEvent 庫,很多流行的類庫的基本思想從他那兒借來的。jQuery的事件處理機(jī)制吸取了 JavaScript 專家 Dean Edwards 編寫的事件處理函數(shù)的精華,使得jQuery處理事件綁定的時(shí)候相當(dāng)?shù)目煽?。在預(yù)留退路(graceful degradation),循序漸進(jìn)以及非入侵式編程思想方面,jQuery 也做的非常不錯(cuò)??偟膩碚f對于 jQuery 的事件綁定做了 2 大塊的處理:

在綁定的時(shí)候做了包裝處理
在執(zhí)行的時(shí)候有過濾器處理

看看 API 的參數(shù):

.on( events [, selector ] [, data ], handler(eventObject) )
  1. events:事件名
  2. selector : 一個(gè)選擇器字符串,用于過濾出被選中的元素中能觸發(fā)事件的后代元素
  3. data :當(dāng)一個(gè)事件被觸發(fā)時(shí),要傳遞給事件處理函數(shù)的
  4. handler : 事件被觸發(fā)時(shí),執(zhí)行的函數(shù)

用來綁定一個(gè)事件:

var body = $('body')
body.on('click','p',function(){
    console.log(this)
})

用 on 方法給 body 上綁定一個(gè) click 事件,冒泡到 p 元素的時(shí)候才出發(fā)回調(diào)函數(shù),這里大家需要明確一點(diǎn):

每次在body上點(diǎn)擊其實(shí)都會(huì)觸發(fā)事件,但是只目標(biāo)為p元素的情況下才會(huì)觸發(fā)回調(diào)的處理函數(shù)。通過源碼不難發(fā)現(xiàn)on方法實(shí)質(zhì)只完成一些參數(shù)調(diào)整的工作,而實(shí)際負(fù)責(zé)事件綁定的是其內(nèi)部 jQuery.event.add方法

看看綁定的實(shí)際接口on的代碼:

on: function(types, selector, data, fn, /*INTERNAL*/ one) {
  //省略部分代碼
  return this.each(function() {
    jQuery.event.add(this, types, fn, data, selector);
  });
}

 jQuery.event.add內(nèi)部實(shí)際上最終還是通過addEventListener綁定的事件

(單擊圖片可放大)

其中一些變量代碼的意思:

  1. elem: 目標(biāo)元素
  2. type: 事件類型,如’click’
  3. eventHandle: 事件句柄,也就是事件回調(diào)處理的內(nèi)容了
  4. false: 冒泡
  5. elem: 目標(biāo)元素type: 事件類型,如’click’eventHandle: 事件句柄,也就是事件回調(diào)處理的內(nèi)容了false: 冒泡

現(xiàn)在我們把之前的案例給套一下看看:

var body = document.getElementsByTagName('body')
var eventHandle = function() {
    console.log(this)
}
body.addEventListener('click', eventHandle, false);

如果是我們自己實(shí)現(xiàn)的這個(gè)代碼是有問題的,我們在body上每次都觸發(fā)了click事件,但是我們并沒有委托的p元素的處理,自然也達(dá)不到委托的效果。

eventHandle源碼

回到內(nèi)部綁定的事件句柄 eventHandle ,可想而知 eventHandle 不僅僅只是只是充當(dāng)一個(gè)回調(diào)函數(shù)的角色,而是一個(gè)實(shí)現(xiàn)了 EventListener 接口的對象。

if (!(eventHandle = elemData.handle)) {
    eventHandle = elemData.handle = function(e) {
        return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
            jQuery.event.dispatch.apply(elem, arguments) : undefined;
    };
}

可見在 eventHandle 中并沒有直接處理回調(diào)函數(shù),而是映射到 jQuery.event.dispatch 分派事件處理函數(shù)了僅僅只是傳入 eventHandle.elem,arguments , 就是 body 元素 與事件對象那么這里有個(gè)問題,事件回調(diào)的句柄并沒有傳遞過去,后面的代碼如何關(guān)聯(lián)?本章的一些地方可能要結(jié)合后面的 dispatch 處理才能清理,但是我們還是先看看做了那些處理。

一個(gè)簡單的流程圖:

 

任務(wù)

?不會(huì)了怎么辦
||

提問題

寫筆記

公開筆記
提交
||

請驗(yàn)證,完成請求

由于請求次數(shù)過多,請先驗(yàn)證,完成再次請求

加群二維碼

打開微信掃碼自動(dòng)綁定

您還未綁定服務(wù)號

綁定后可得到

  • · 粉絲專屬優(yōu)惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復(fù)提醒
  • · 賬號支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請您關(guān)注公眾號
關(guān)注后,及時(shí)獲悉本課程動(dòng)態(tài)

舉報(bào)

0/150
提交
取消
全部 精華 我要發(fā)布
全部 我要發(fā)布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費(fèi)2個(gè)積分

你的積分不足,無法發(fā)表

為什么扣積分?

本次提問將花費(fèi)2個(gè)積分

繼續(xù)發(fā)表請點(diǎn)擊 "確定"

為什么扣積分?