成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

jQuery代碼優(yōu)化之基本事件

開發(fā) 前端
jQuery對事件系統(tǒng)的抽象與優(yōu)化也是它的一大特色。本文僅從事件系統(tǒng)入手,簡要分析一下jQuery為什么提供mouseenter和mouseleave事件,它們與標準的mouseover、mouseout事件有什么區(qū)別。

jQuery對事件系統(tǒng)的抽象與優(yōu)化也是它的一大特色。本文僅從事件系統(tǒng)入手,簡要分析一下jQuery為什么提供mouseenter和mouseleave事件,它們與標準的mouseover、mouseout事件有什么區(qū)別。

事件模型

說到事件,就要追溯到網(wǎng)景與微軟的“瀏覽器大戰(zhàn)”了。當時,事件模型還沒有標準,兩家公司的實現(xiàn)就是事實標準。網(wǎng)景在Navigator中實現(xiàn)了“事件捕獲”的事件系統(tǒng),而微軟則在IE中實現(xiàn)了一個基本上相反的事件系統(tǒng),叫做“事件冒泡”。這兩種系統(tǒng)的區(qū)別在于當事件發(fā)生時,相關(guān)元素處理(響應)事件的優(yōu)先權(quán)不同。

下面舉例說明這兩種事件機制的區(qū)別。假設文檔中有如下結(jié)構(gòu):

  1. <div> 
  2.     <span> 
  3.         <a>...</a> 
  4.     </span> 
  5. </div> 

因為這三個元素是嵌套的,所以單擊了a,實際上也就單擊了span和div。換句話說,這三個元素都應該有處理單擊事件的機會。在事件捕獲機制下,處理這個單擊事件的優(yōu)先次序是:div > span > a;而在事件冒泡機制下,處理這個單擊事件的優(yōu)先次序則是:a > span > div。

后來,W3C的規(guī)范要求瀏覽器同時支持捕獲和冒泡機制,并允許開發(fā)人員選擇把事件注冊到哪個階段。于是就有了下面這個注冊事件的標準方法:

  1. target.addEventListener(type, listener, useCapture Optional ); 

其中:

◆ type:字符串,表示監(jiān)聽的事件類型

◆ listener:監(jiān)聽器對象(JavaScript函數(shù)),在指定事件發(fā)生時可以收到通知

◆ useCapture:布爾值,是否注冊到捕獲階段

在實際應用開發(fā)中,為了確保與IE(因為它不支持捕獲)兼容,useCapture一般都指定為false(默認值也是false)。換句話說,只把事件注冊到冒泡階段;對于上面那個簡單的例子來說,響應順序就是:a > span > div。

冒泡的副作用

如前所述,IE的冒泡事件模型基本上成為了事實標準。但冒泡有一個副作用。

仍以前面的文檔結(jié)構(gòu)為例,假設它是界面中的一個菜單項,我們希望用戶鼠標離開div時隱藏菜單。于是,我們給div注冊了一個mouseout事件。如果用戶鼠標是從div離開的,那么一切正確。而如果用戶鼠標是從a或span離開的,問題就來了。因為由于事件冒泡,從這兩個元素開始分派的mouseout事件都會傳播到div,從而導致鼠標并沒有離開div,菜單就提前隱藏了。

當然,冒泡的副作用不難避免。比如,給div內(nèi)部的每個元素都注冊mouseout事件,并使用.stopPropagation()方法阻止事件進一步傳播。對于IE,就得將事件對象的cancelBubble屬性設置為false,取消事件冒泡。不過,這仍然回到自己處理瀏覽器不兼容性問題的老路上了。

優(yōu)化方案

為了避免冒泡的副作用,jQuery提供了mouseenter和mouseleave事件,就使用它們來代替mouseover和mouseout吧。

下面這個摘自jQuery的內(nèi)部函數(shù)withinElement,就是為mouseenter和mouseleave提供支持的。翻譯了一下注釋,僅供大家參考。

  1. // 下面這個函數(shù)用于檢測事件是否發(fā)生在另一個元素的內(nèi)部  
  2. // 在 jQuery.event.special.mouseenter 和 mouseleave 處理程序中使用  
  3. var withinElement = function( event ) {  
  4.     // 檢測 mouse(over|out) 是否還在相同的父元素內(nèi)  
  5.     var parent = event.relatedTarget;  
  6.  
  7.     // 設置正確的事件類型  
  8.     event.type = event.data;  
  9.  
  10.     // Firefox 有時候會把 relatedTarget 指定一個 XUL 元素  
  11.     // 對于這種元素,無法訪問其 parentNode 屬性  
  12.     try {  
  13.  
  14.         // Chrome 也類似,雖然可以訪問 parentNode 屬性  
  15.         // 但結(jié)果卻是 null  
  16.         if ( parent && parent !== document && !parent.parentNode ) {  
  17.             return;  
  18.         }  
  19.  
  20.         // 沿 DOM 樹向上  
  21.         while ( parent && parent !== this ) {  
  22.             parent = parent.parentNode;  
  23.         }  
  24.  
  25.         if ( parent !== this ) {  
  26.             // 如果實際正好位于一個非子元素上面,那好,就處理事件  
  27.             jQuery.event.handle.apply( this, arguments );  
  28.         }  
  29.  
  30.     // 假定已經(jīng)離開了元素,因為很可能鼠標放在了一個XUL元素上  
  31.     } catch(e) { }  
  32. }, 

結(jié)論

在jQuery里,可以使用mouseenter和mouseleave事件來避免事件冒泡的副作用。

原文:http://www.ituring.com.cn/article/420

【編輯推薦】

  1. jQuery性能優(yōu)化
  2. JavaScript代碼優(yōu)化新工具UglifyJS
  3. 記一次失敗的jQuery優(yōu)化嘗試
  4. 精益求精 jQuery代碼的分析與優(yōu)化
  5. JavaScript性能優(yōu)化技巧之函數(shù)節(jié)流
責任編輯:陳貽新 來源: 圖靈社區(qū)
相關(guān)推薦

2012-04-26 13:12:09

jQuery代碼優(yōu)化

2011-11-02 17:17:06

jQuery

2011-06-14 11:14:10

性能優(yōu)化代碼

2011-01-21 10:01:07

jQueryjavascriptweb

2013-09-16 16:01:23

Android開發(fā)代碼

2015-07-21 05:55:12

2013-12-02 15:21:30

jQuery插件

2013-06-09 15:31:35

jQueryjQuery優(yōu)化性能優(yōu)化

2011-08-03 16:51:01

jQuery

2013-12-02 14:33:41

jQuery事件

2011-07-19 17:09:44

jQuery Mobi事件

2011-06-22 17:11:18

SEO

2012-01-12 14:37:34

jQuery

2010-08-04 11:15:22

Flex事件處理

2011-06-20 14:44:49

網(wǎng)站優(yōu)化

2011-06-24 16:44:43

網(wǎng)站優(yōu)化

2011-06-28 18:04:06

網(wǎng)站優(yōu)化

2021-07-29 14:20:34

網(wǎng)絡優(yōu)化移動互聯(lián)網(wǎng)數(shù)據(jù)存儲

2010-03-16 11:20:53

Linux 優(yōu)化

2010-08-03 11:35:06

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产999精品久久久久久 | 一区二区三区视频在线观看 | 国产乱码精品1区2区3区 | 亚洲一区二区中文字幕 | 97久久精品午夜一区二区 | 男女羞羞视频大全 | 国产精品美女久久久久 | .国产精品成人自产拍在线观看6 | 国产一级特黄真人毛片 | 欧美黑人巨大videos精品 | 国产91久久精品一区二区 | 亚洲精品乱码久久久久久黑人 | 五月天激情电影 | 国产精品亚洲成在人线 | 久草网在线视频 | 国产一二三区精品视频 | 国产精品久久久久一区二区 | 成人av电影在线 | 尤物在线精品视频 | 国产在线一区二区三区 | 成人国产一区二区三区精品麻豆 | 91色在线| 亚洲理论在线观看电影 | 欧美成人a | 精品一区二区久久 | 精品国产乱码一区二区三区 | 日韩av在线一区二区三区 | 国产黄色一级电影 | 亚洲小说图片 | 我爱操| 久久国内精品 | 一区二区影院 | www.久久.com | 欧美在线a| 中文字幕一二三区 | 99久9| 亚洲欧美日韩精品久久亚洲区 | 国产欧美日韩一区二区三区在线 | 欧美一级欧美三级在线观看 | 欧美精品啪啪 | 国产欧美精品 |