亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

對jQuery的事件綁定的一些思考(補充)

2019-11-20 22:47:52
字體:
來源:轉載
供稿:網友
首先我們看下面的一個很常見的事件綁定代碼:

復制代碼 代碼如下:

//example
$('#dom').click(function(e){
//do something
});

$('#dom2').click(function(e){
//do something
});


這段代碼在事件綁定處理上有一些缺陷:

過多的事件綁定會損耗內存
后期生成HTML會沒有事件綁定,需要重新綁定
語法過于繁雜

解決方案

對于1、2兩點的解決方案,我們首先先了解一下jQuery的事件綁定

jQuery的事件綁定有多個方法可以調用,以click事件來舉例:

click方法

bind方法
delegate方法
on方法

不管你用的是(click / bind / delegate)之中那個方法,最終都是jQuery底層都是調用on方法來完成最終的事件綁定。因此從某種角度來講除了在書寫的方便程度及習慣上挑選,不如直接都采用on方法來的痛快和直接。

關于對方法的詳細解釋和用例,請直接訪問jQuery官網,在這里不一一說明。api.jquery.com

性能

首先我們需要先對不同的事件綁定方式之間的內存占用差距有一個清晰的認識。

對于性能的分析將采用Chrome的Developer Tools。
Profiles --> Take Heap Snapshot,用這個工具我們可以看到Javascript所占用的內存,能夠對性能問題進行分析。

DEMO HTML

復制代碼 代碼如下:

<html>
<head>
<script type="text/javascript">
$(function(){
$('#btn-add').click(function(){
$('.ul').prepend('<li><a href="javascript:;">text</a></li>');
});
});
</script>
</head>
<body>
<button id="btn-add">Create Element</button>
<ul class="ul">
<li><a href="javascript:;">text</a></li>
<!-- 2000 line... -->
<li><a href="javascript:;">text</a></li>
</ul>
</body>
</html>


Method 1
復制代碼 代碼如下:

$(function(){
$('.ul a').click(function(e){
alert('click event');
});
});

以下是Method 1的內存分析圖

內存占用約3.4M

Method 2
復制代碼 代碼如下:

$(function(){
$('.ul').on('click', 'a', function(e){
alert('click event');
});
});


以下是Method 2的內存分析圖

內存占用約2.0M

結論
Method 1 明顯比 Method 2 多耗1.4M的內存

Method 1 無法將事件綁定到通過點擊button所新增DOM中來,而Method 2可以。
只要on的delegate對象是HTML頁面原有的元素,由于是事件的觸發是通過Javascript的事件冒泡機制來監測,所以對于所有子元素(包括后期通過JS生成的元素)所有的事件監測均能有效,且由于不用對多個元素進行事件綁定(在這個example中為2000+a標簽),能夠有效的節省內存的損耗。

思考
代碼如詩,但很容易變成代碼如屎。如何提高代碼的優雅程度也是一個很有意思的事情。

以下是一個很普通且普遍的JS文件的代碼片段(用于一般網站)

復制代碼 代碼如下:

$('#btn-add').click(function(){
//do something
});
$('.action-box #btn-delete').click(function(){
//do something
});
$('.action-box #btn-sort').mouseenter(function(){
//do something
});
/**
**more same code
*/


毫不夸張的說,當一個js文件上百行后,類似于上面的代碼,你很難從里面發現規律。

1、可能A喜歡寫#btn-add,而B喜歡寫.action-box #btn-add來作為選擇符。
2、堆砌著許多不同類型事件,沒有一個次序可言
3、沒有運用到我們剛剛所講的利用事件冒泡來做事件綁定

改進
我們來一步步改進一下之前的JS代碼

Version 1

復制代碼 代碼如下:

$('.action-box').on('click', '#btn-add', function(){
  //do something
});
$('.action-box').on('click', '#btn-delete', function(){
  //do something
});

雖然運用了事件冒泡,不過感覺還是有點累贅,.action-box出現多次,感覺不舒服,讓我們繼續改進

Version 2

復制代碼 代碼如下:

$('.action-box').on('click', '#btn-add, #btn-delete', function(){
  if($(this).attr('id') == 'btn-add'){
    //do something
  } else{
    //do something
  }
});

感覺比剛剛好多了,不過還是需要判斷元素來做出相應的處理,能接受,但不完美。

靈感

首先看一下css的增強版本sass對于css語法上面的改進

復制代碼 代碼如下:

/*bed css code*/
.action-box { width: 100%; color: #000; }
#btn-add { color: blue; }
#btn-delete { color: red; }

/*good css code*/
.action-box { width: 100%; color: #000; }
  .action-box #btn-add { color: blue; }
  .action-box #btn-delete { color: red; }

/*sass code*/
.action-box {
  width: 100%;
  color: #000;
  #btn-add {
    color: blue;
  }
  #btn-delete {
    color: red;
  }
}

我們可以在 good css code 和 sass code 從中可以可以很清晰了然的看到文檔結構:.action-box 下面有兩個button。

這是否能讓sass這種代碼結構運用到js中來呢?答案當然是可以。

復制代碼 代碼如下:

$('.action-box').coffee({
  click: {
    '#btn-add': function(){
      //do something
    },
    //這是是支持jQuery的':last / [attr] / :eq(0)'等方法的
    '#btn-delete': function(){
      //do something
    }
  },
  mouseenter: {
    '#btn-sort': function(){
      //do something
    }
  }
});

喜歡這種結構嗎?

1、清晰明了的文檔結構
2、運用事件冒泡,有效減少內存的占用
3、第一級別用事件名稱來劃分
4、第二級別的屬性名相當于選擇符。

coffee函數的源碼

復制代碼 代碼如下:

$.fn.coffee = function(obj){
  for(var eName in obj)
    for(var selector in obj[eName])
      $(this).on(eName, selector, obj[eName][selector]);
}

聊聊數行代碼,就可以做成一個很美妙的語法糖

Enjoy yourself !  ^_^

作者: CoffeeDeveloper

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人免费在线视频网址| 97免费在线视频| 国产精品91久久| 亚洲欧美精品suv| 亚洲一区二区三区成人在线视频精品| 国产亚洲欧美一区| 精品亚洲一区二区三区| 国产一区二区三区在线观看视频| 成人黄色午夜影院| 91精品国产高清自在线看超| 久久精品美女视频网站| 欧美亚洲第一区| 日韩av在线免费观看| 91久久综合亚洲鲁鲁五月天| 国产成人高清激情视频在线观看| 亚洲二区中文字幕| 欧美在线亚洲一区| 国产精品久久久av| 欧美激情视频播放| 国产精品第七影院| 欧美性xxxxhd| 久久五月情影视| 亚洲美女动态图120秒| y97精品国产97久久久久久| 精品人伦一区二区三区蜜桃免费| 2020久久国产精品| 国产丝袜精品视频| 欧美高清视频在线观看| 一区二区亚洲欧洲国产日韩| 日韩亚洲第一页| 亚洲色图激情小说| 欧美福利视频在线观看| 亚洲专区国产精品| 97精品国产97久久久久久春色| 国内久久久精品| 国产噜噜噜噜噜久久久久久久久| 欧美成人精品一区二区三区| 亚洲欧美激情四射在线日| 亚洲综合国产精品| 国产suv精品一区二区三区88区| 欧美一区二区三区……| 久久久国产精品一区| 免费av一区二区| 国产精品成人久久久久| 91免费在线视频| 日韩视频欧美视频| 欧美精品一本久久男人的天堂| 欧美巨乳美女视频| 欧美极品少妇xxxxⅹ裸体艺术| 欧美另类老肥妇| 成人观看高清在线观看免费| 国产精品爽黄69天堂a| 亚洲大尺度美女在线| 日韩av在线影视| 久久久久久有精品国产| 最近2019好看的中文字幕免费| 亚洲欧美日韩中文视频| 成人有码视频在线播放| 成年无码av片在线| 国内精品久久久久久中文字幕| 日韩av在线直播| 久久av在线看| 免费不卡欧美自拍视频| 国产精品免费久久久久影院| 97在线观看视频国产| 日韩欧美国产一区二区| 欧美国产亚洲精品久久久8v| 日本精品久久久久影院| 亚洲国产精品va在看黑人| 国产91精品最新在线播放| 国产精品pans私拍| 国产精品第8页| 在线一区二区日韩| 成人激情电影一区二区| 国产精品老女人视频| 日韩高清av一区二区三区| 高清一区二区三区日本久| 国产精品视频导航| 国产香蕉一区二区三区在线视频| 亚洲区在线播放| 韩国日本不卡在线| 色综合导航网站| 亚洲欧美日韩中文在线| 亚洲九九九在线观看| 亚洲人成电影网| 国产成人精品午夜| 中文字幕日韩av综合精品| 九九视频直播综合网| 国内精品久久久久久久| 91精品国产综合久久久久久蜜臀| 国产日韩在线看| 久久亚洲国产成人| 国产91色在线播放| 亚洲第一精品夜夜躁人人爽| 欧美激情视频给我| 欧美俄罗斯性视频| 国产丝袜高跟一区| 成人av资源在线播放| 久久人人爽人人爽爽久久| 亚洲综合中文字幕68页| 亚洲国产成人91精品| 国产亚洲成av人片在线观看桃| 中文字幕自拍vr一区二区三区| 亚洲男人第一网站| 亚洲图片制服诱惑| 91av福利视频| 欧美综合在线第二页| 欧美日韩一区免费| 在线视频欧美日韩精品| 日韩在线不卡视频| 日韩免费在线播放| 色综合亚洲精品激情狠狠| 国产欧美一区二区| 日韩av在线免费观看一区| 欧美日韩亚洲91| 成人免费视频在线观看超级碰| 亚洲精品中文字幕有码专区| 久久久噜噜噜久久中文字免| 国产69精品99久久久久久宅男| 97热精品视频官网| 久久色精品视频| 亚洲欧洲xxxx| 久久全国免费视频| 黑人巨大精品欧美一区免费视频| 精品久久国产精品| 亚洲精品国精品久久99热一| 精品小视频在线| 日韩在线www| 亚洲а∨天堂久久精品9966| 狠狠色狠狠色综合日日五| 激情懂色av一区av二区av| 亚洲欧美另类中文字幕| 91成人性视频| 人人澡人人澡人人看欧美| 国产日韩欧美在线| 亚洲美女喷白浆| 久久这里有精品视频| 欧美激情亚洲自拍| 国产又爽又黄的激情精品视频| 亚洲图片制服诱惑| 日韩欧美aⅴ综合网站发布| 欧美在线亚洲在线| 国产精品h片在线播放| 成人免费网站在线观看| 欧美成人性色生活仑片| 国产亚洲a∨片在线观看| 91精品久久久久久综合乱菊| 国产精品黄视频| 91精品国产91久久久久久久久| 日韩最新在线视频| 欧美一级大片在线观看| 久久中国妇女中文字幕| 亚洲欧洲中文天堂| 色婷婷av一区二区三区久久| 岛国av一区二区在线在线观看| 欧美激情欧美狂野欧美精品| 欧美在线国产精品| 成人淫片在线看| 中文字幕一区二区精品| 久久久国产一区二区三区| 亚洲电影中文字幕| 精品美女永久免费视频| 国产亚洲在线播放| 亚洲第一区在线观看|