亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

jQuery基本事件代碼優化的示例分析

發布時間:2021-09-16 17:43:17 來源:億速云 閱讀:109 作者:小新 欄目:web開發

這篇文章主要介紹了jQuery基本事件代碼優化的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

事件模型

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

下面舉例說明這兩種事件機制的區別  。假設文檔中有如下結構:

<div>       <span>           <a>...a>       span>   div>

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

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

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

其中:

type:字符串,表示監聽的事件類型

listener:監聽器對象(JavaScript函數),在指定事件發生時可以收到通知

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

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

冒泡的副作用

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

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

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

優化方案

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

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

// 下面這個函數用于檢測事件是否發生在另一個元素的內部    // 在 jQuery.event.special.mouseenter 和 mouseleave 處理程序中使用    var withinElement = function( event ) {        // 檢測 mouse(over|out) 是否還在相同的父元素內        var parent = event.relatedTarget;           // 設置正確的事件類型        eventevent.type = event.data;           // Firefox 有時候會把 relatedTarget 指定一個 XUL 元素        // 對于這種元素,無法訪問其 parentNode 屬性        try {               // Chrome 也類似,雖然可以訪問 parentNode 屬性            // 但結果卻是 null            if ( parent && parent !== document && !parent.parentNode ) {                return;            }               // 沿 DOM 樹向上            while ( parent && parent !== this ) {                parentparent = parent.parentNode;            }               if ( parent !== this ) {                // 如果實際正好位于一個非子元素上面,那好,就處理事件                jQuery.event.handle.apply( this, arguments );            }           // 假定已經離開了元素,因為很可能鼠標放在了一個XUL元素上        } catch(e) { }    },

感謝你能夠認真閱讀完這篇文章,希望小編分享的“jQuery基本事件代碼優化的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海晏县| 阳山县| 江源县| 启东市| 岗巴县| 印江| 拜城县| 兴义市| 平邑县| 龙江县| 满城县| 吐鲁番市| 明星| 临湘市| 平泉县| 江城| 烟台市| 甘南县| 拉萨市| 化州市| 青海省| 肥东县| 辛集市| 建德市| 会昌县| 渝北区| 若羌县| 望都县| 麻阳| 东海县| 政和县| 来安县| 竹溪县| 繁昌县| 乌兰察布市| 台前县| 海林市| 淮北市| 芮城县| 习水县| 泽州县|