国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Javascript事件代理の真理

lijy91 / 1954人閱讀

摘要:參考資料事件代理很久很久以來(lái),總感覺(jué)事件發(fā)生與事件代理到之間沒(méi)什么鳥(niǎo)區(qū)別。要搞清楚什么是事件代理,就需要先搞清楚什么是代理。,怎么從字面來(lái)理解事件代理一詞的含義后文有講。于是,看了事件代理的資料。這一過(guò)程被稱為事件冒泡。

參考資料:js-事件代理

很久很久以來(lái),總感覺(jué)事件發(fā)生與事件代理到之間沒(méi)什么鳥(niǎo)區(qū)別。

最近,又看了一下,感覺(jué)區(qū)別其實(shí)真不大!看怎么理解吧。

要搞清楚什么是事件代理,就需要先搞清楚什么是代理。

從商業(yè)角度來(lái)講,代理就是:我有貨,你沒(méi)貨,但丫我沒(méi)時(shí)間、沒(méi)精力全部賣掉,而你一天閑的蛋疼,只剩下時(shí)間了。于是,我委托你幫我買,然后哥給你提成。這個(gè)過(guò)程中,你實(shí)際上相當(dāng)于也有了貨。

OK,怎么從字面來(lái)理解事件代理一詞的含義?后文有講。

一 先看一個(gè)真實(shí)的,新手綁定onclik事件的例子

如果按照之前的我,我會(huì)怎么給每一個(gè)li標(biāo)簽,添加onlick呢?廢話,要是我,肯定簡(jiǎn)單粗暴。
循環(huán)每一個(gè)li,然后全部綁定onlick。

于是我的代碼應(yīng)該是這樣子:

  • 001
  • 002
  • 003

好像看起來(lái)沒(méi)問(wèn)題了。雖然,有些文章說(shuō)這樣很消耗性能,但是,我丫電腦好,老子管你性能,不能太認(rèn)真。

二 突然有一天,我發(fā)現(xiàn)通過(guò)js添加進(jìn)來(lái)的新的li,沒(méi)有綁定onlcik
var node=document.createElement("li");
var textnode=document.createTextNode("maomaoliang");
node.appendChild(textnode);
document.getElementById("ul1").appendChild(node);

然后,點(diǎn)擊maomaoliang,它并沒(méi)有綁定我的onlick,這是為什么?
哦,原來(lái),我原有的li跟我后面生成的li根本不是同時(shí)發(fā)生的,在創(chuàng)建新的li元素之前,已經(jīng)給存在的li加事件了。好吧,好煩啊。

三 那怎么破?

然后,又好(無(wú))奇(奈)的看了一些文章,原來(lái)有個(gè)叫事件代理的東西可以用。我就試試看吧!于是改寫(xiě)了部分代碼,像這樣:

var thl= document.getElementById("thl");
thl.onclick = function(ev) {
    ev = ev || event;
    //兼容處理
    var target = ev.target || ev.srcElement;
  //找到li元素
    if (target.nodeName.toLowerCase() == "li") {
          fn();
     }
};

function fn (){
  console.log("maomaoliang");
}

結(jié)果,點(diǎn)擊新的li,居然也觸發(fā)了fn函數(shù)。好吧,身為一個(gè)好奇心驅(qū)動(dòng)的肉身,我怎么能不求甚解呢?還是要踏實(shí)點(diǎn),搞清楚這其中的奧秘才行。

于是,看了事件代理的資料。

首先,要知道什么是事件冒泡:當(dāng)一個(gè)元素上的事件被觸發(fā)的時(shí)候,比如說(shuō)鼠標(biāo)點(diǎn)擊了一個(gè)按鈕,同樣的事件將會(huì)在那個(gè)元素的所有祖先元素中被觸發(fā)。這一過(guò)程被稱為事件冒泡。

然后,再回到之前的問(wèn)題“怎么從字面來(lái)理解事件代理一詞的含義”,誰(shuí)代理了事件?或者事件代理了誰(shuí)?
以本文的例子來(lái)講,看看改動(dòng)后的代碼,我把onlick事件綁定到了ul標(biāo)簽上面,而不是li標(biāo)簽。于是,當(dāng)我點(diǎn)擊任何一個(gè)li標(biāo)簽(不管是動(dòng)態(tài)生成的還是之前就有的)是,這個(gè)事件就像泡泡一樣,冒啊冒。由于我這里給ul綁定了onlick,那么這時(shí),ul會(huì)捕獲冒泡上來(lái)的onclick事件。

接著, var target = ev.target || ev.srcElement;這一句話,相當(dāng)于告訴了我,我究竟點(diǎn)的是誰(shuí),誰(shuí)才是target。如果,這個(gè)target剛剛好就是li標(biāo)簽if (target.nodeName.toLowerCase() == "li"),那么執(zhí)行fn函數(shù)。

最后,我驕傲的回答了那個(gè)問(wèn)題:ul標(biāo)簽代理了onlick事件!

四 回憶一下事件代理的步驟

父元素綁定事件

父元素知道事件的實(shí)際發(fā)生目標(biāo)是誰(shuí)

我們要對(duì)目標(biāo)進(jìn)行判斷,如果是我們需要的元素,則發(fā)生回調(diào)函數(shù)(所以要學(xué)好選擇器的使用)

五 最后總結(jié),事件代理兩大好處

性能不小心得到了優(yōu)化

動(dòng)態(tài)添加的元素也能綁定事件了

六 需要注意的一點(diǎn)是

上述針對(duì)的是原生js事件綁定來(lái)講的,如果你用到了jquery。并把代碼改成了如下的樣子:

/*var thl= document.getElementById("ul1");
thl.onclick = function(ev) {
    ev = ev || event;
    //兼容處理
    var target = ev.target || ev.srcElement;
  //找到li元素
    if (target.nodeName.toLowerCase() == "li") {
          //li添加的事件
          fn();
     }
};*/

var node=document.createElement("li");
var textnode=document.createTextNode("maomaoliang");
node.appendChild(textnode);
document.getElementById("ul1").appendChild(node);

function fn (){
  console.log("maomaoliang");
}

$("#ul1").click(function(){
    fn();
});

這樣一來(lái),新添加的li標(biāo)簽,也能綁click,是不是很方便、很簡(jiǎn)單,是不是感覺(jué)學(xué)js沒(méi)什么卵用。
哈哈,這樣想很正常,我以前也這么想,但是,做了一些東西之后,發(fā)現(xiàn)jquery還真的不夠用了!但是基本夠用!
雖然,大神們都說(shuō)要學(xué)js,但我還是覺(jué)得可以先學(xué)jquery,之后再學(xué)js,效果也可以的。

大神嘛,哪懂叼絲的痛楚。-。-

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/78611.html

相關(guān)文章

  • 網(wǎng)頁(yè)與瀏覽器窗口真理

    摘要:參考資料首先,網(wǎng)頁(yè)大小與瀏覽器窗口大小從來(lái)都不是一回事這尼瑪最近才明白,坑所以,要知道以下常網(wǎng)頁(yè)的范圍我們?cè)诖a里面設(shè)置的或者腳本,改變的樣式就是網(wǎng)頁(yè)范圍下的改變,也就是說(shuō),我們?cè)O(shè)置的大小是網(wǎng)頁(yè)的不是瀏覽器窗口的大小。 參考資料 首先,網(wǎng)頁(yè)大小與瀏覽器窗口大小從來(lái)都不是一回事!!!這尼瑪最近才明白,坑~ 所以,要知道以下常: 網(wǎng)頁(yè)的范圍我們?cè)诖a里面設(shè)置的CSS或者js腳本,改變的樣式...

    tinysun1234 評(píng)論0 收藏0
  • JavaScript 客戶端檢測(cè)

    摘要:博文模塊增強(qiáng)模式進(jìn)行客戶端檢測(cè)標(biāo)簽博文常用的檢測(cè)方式為能力檢測(cè)用戶代理檢測(cè)這里有用戶代理檢測(cè)檢測(cè)插件非瀏覽器是一個(gè)包含瀏覽器插件的數(shù)組這個(gè)數(shù)組的每一項(xiàng)都包含插件的名字插件的描述插件的文件名插件所處理的類型數(shù)量檢測(cè)插件在中無(wú)效方法用于把字符串 [博文]模塊增強(qiáng)模式進(jìn)行客戶端檢測(cè) 標(biāo)簽: 博文 常用的檢測(cè)方式為: [ ] 1 . 能力檢測(cè) [ ] 2 . 用戶代理檢測(cè) 這里有 2 ...

    KnewOne 評(píng)論0 收藏0
  • 【呆萌研究】JavaScript閉包

    摘要:為什么會(huì)產(chǎn)生閉包究其根本,是因?yàn)榇淼暮瘮?shù)包含的作用域。而在作用域鏈中,外部函數(shù)的活動(dòng)對(duì)象始終處于第二位,外部函數(shù)的外部函數(shù)的活動(dòng)對(duì)象處于第三位直到作為作用域鏈終點(diǎn)的全局執(zhí)行環(huán)境。 前言 此文的內(nèi)容主要是來(lái)自看書(shū)的總結(jié)+小小的實(shí)踐哦~會(huì)不斷更新總結(jié)。 什么是閉包 書(shū)上是這樣定義閉包的: 有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中變量的函數(shù)。 舉一個(gè)例子: function test(){ va...

    CHENGKANG 評(píng)論0 收藏0
  • 何為語(yǔ)法樹(shù)

    摘要:原文鏈接何為語(yǔ)法樹(shù)什么是語(yǔ)法樹(shù)你是否曾想過(guò),這個(gè)世界存在這么多語(yǔ)言的意義。語(yǔ)法樹(shù),計(jì)算機(jī)描述世界真理的樹(shù)狀結(jié)構(gòu)。不同的語(yǔ)言,都會(huì)配之不同的語(yǔ)法分析器,而語(yǔ)法分析器是把源代碼作為字符串讀入解析,并建立語(yǔ)法樹(shù)的程序。 原文鏈接:BlueSun | 何為語(yǔ)法樹(shù) 什么是語(yǔ)法樹(shù)? 你是否曾想過(guò),這個(gè)世界存在這么多語(yǔ)言的意義。 假如現(xiàn)在你面前有一個(gè)物體,它是一個(gè)不規(guī)則的圓體,整個(gè)身體通紅,頭部還有...

    hikui 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<