在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

JavaScript中事件模型的詳細說明(代碼示例)

JavaScript中事件模型的詳細說明(代碼示例)

更新時間:2025-12-08 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于JavaScript中事件模型的詳解(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

事件

用戶與網頁交互是通過事件實現的,事件剛開始是作為分擔服務器負載的一個手段,起初沒有統一的規范,直到 DOM2 級,網景和 IE 才開始有各自的 API 規范。

對于事件的觸發機制,兩個公司都認為頁面的觸發機制并不只是點擊了某個元素,就只觸發當前目標元素的事件。

比方說:頁面有多個同心圓,當點擊最里面的圓時,你其實也點擊了包含這個圓外面的那些圓。 兩個公司對這點的認同是一致的,但是事件流的傳播順序上采用了不同的兩種方案來實現,即事件冒泡和事件捕獲。

一、事件冒泡

IE 瀏覽器從老版本開始就一直支持事件冒泡機制,所謂事件冒泡,指事件流開始是從較為具體的元素接收,一直傳播上不具體的元素上。

就是從目標元素傳播到父級元素。

<body>
    <div id="parent">
        <div id="child"></div>
    </div>
    <script>
    function childEventHandler(event) {
        console.log(this);
        console.log("child 被點擊了");
    }
    function parentEventHandler(event) {
        console.log(this);
        console.log("parent 被點擊了");
    }
    function bodyEventHandler(event) {
        console.log(this);
        console.log("body 被點擊了");
    }
    function htmlEventHandler(event) {
        console.log(this);
        console.log("html 被點擊了");
    }
    function documentEventHandler(event) {
        console.log(this);
        console.log("document 被點擊了");
    }
    function windowEventHandler(event) {
        console.log(this);
        console.log("window 被點擊了");
    }
    var bodyEl = document.getElementsByTagName("body")[0];
    var htmlEl = document.getElementsByTagName("html")[0];
    var win = window;
    var parentEl = document.getElementById("parent");
    var childEl = document.getElementById("child");
    childEl.onclick = childEventHandler;
    parentEl.onclick = parentEventHandler;
    bodyEl.onclick = bodyEventHandler;
    htmlEl.onclick = htmlEventHandler;
    document.onclick = documentEventHandler;
    win.onclick = windowEventHandler;
    </script>
</body>

如下圖所示,如果點擊了 id 為 child 的元素后,事件流會從 child 一直傳播到 window 對象。

3758644449-5bf4b9858bdeb_articlex.png

4127740186-5bf4b98586814_articlex.png

所有現代瀏覽器都支持事件冒泡。

二、事件捕獲

由網景公司主導的事件捕獲則剛好和事件冒泡相反,事件流開始從不具體的元素觸發,然后傳播到具體的元素上。簡而言之就是從父級元素傳播到目標元素。

720739237-5bf4b985873b2_articlex.png

由于事件捕獲是從 IE 9開始支持,不兼容老版本瀏覽器,所以使用的人比較少。

三、事件流

DOM 規定事件包括三個階段,事件捕獲,處于目標階段、事件冒泡。

從 IE 9 開始的瀏覽器規定,事件流的順序先是事件捕獲,會截獲到事件,然后是處于目標階段,實際的目標接收到事件,最后是事件冒泡,可以在這個階段對事件進行響應。

以之前的 child 元素為例,直到 child 元素接收到事件前(從 window 到 parent),都是事件捕獲階段。到了 child 元素,此時對事件進行處理,隨后冒泡到 window 對象上,冒泡階段也是可以對事件進行處理的。 基于事件冒泡能對事件進行處理的特點,隨后將講到與其有關的事件委托機制。

3575085388-5bf4b9858438b_articlex.png

四、事件綁定

HTML 與 事件的綁定有三種形式:

1. 
<div id="child" onclick="console.log('hello');"></div>

2. 

var childEl = document.getElementById("child");
childEl.onclick = function() {
    console.log('hello');
}

3. 
var childEl = document.getElementById("child");
childEl.addEventListener('click', function() {
    console.log('hello');
}, false);

JavaScript 是單線程的語言,在遇到元素有事件觸發時,會在事件隊列中尋找有沒有與這個事件綁定的函數,如果沒有則什么都不做,如果有,則將該函數放到事件隊列的前面,等待主線程事件執行完畢后執行。

上述代碼第一種綁定,將事件寫在 html 中,表現和行為沒有解耦,是不建議這樣寫代碼的。

第二種綁定,將事件綁定在元素對象上,這種寫法主要是容易發生事件的覆蓋。

第三種綁定,首先,第三個參數為布爾值,默認為 false, 表示在事件冒泡階段調用事件處理程序,如果為 true, 則表示在事件捕獲階段調用事件處理函數。

當我們想處理完一次事件后,將不想在處理該元素的事件綁定時,應該將元素的事件綁定置為空,如果容易發生內存泄漏。

第一種寫法:
childEl.onclick = null;


第三種寫法:
function eventHandler() {
    console.log('hello');
}

childEl.addEventListener('click', eventHandler, false);

childEl.removeEventListener('click', eventHandler, false);

五、事件委托(事件代理)

事件委托是利用事件冒泡的性質,事件流開始是從較為具體的元素接收,一直傳播上不具體的元素上。

首先,假如有一個列表 ul,每個列表元素 li 點擊會觸發事件處理程序,顯然,如果一個一個地給元素綁定事件, 效率肯定不好。

與此同時,當新增一個元素時,事件不見得會綁定成功。一起來看:

<ul id="menu">
    <li class="menu-item">menu-1</li>
    <li class="menu-item">menu-2</li>
    <li class="menu-item">menu-3</li>
    <li class="menu-item">menu-4</li>
</ul>
<input type="button" name="" id="addBtn" value="添加" />

<script>
window.onload = function() {
        var menu = document.getElementById("menu");
        var item = menu.getElementsByClassName('menu-item');
        for (var i = 0; i < item.length; i++) {
            item[i].onclick = (function(i) {
                return function() {
                    console.log(i);
                }
            }(i))
        }

        var addBtnEl = document.getElementById("addBtn");
        addBtnEl.onclick = function() {
            var newEl = document.createElement('li');
            newEl.innerHTML = "menu-new"
            menu.appendChild(newEl);
        }
    }
</script>

新增加的 menu-new,點擊發現沒有反應,說明事件沒有綁定進去,但是我們也并不想,每增加一個新元素,就為這個新元素綁定事件,重復低效率的工作應當避免去做。

我們通過事件委托的思路來想,事件流的傳播,目標元素本身依然會有事件,但同時,冒泡出去后,更高層次的 dom 也能處理事件程序。那么,我們只需要給高層次節點綁定事件,通過判斷具體是觸發的哪個子節點,再做相應的事件處理。

<ul id="menu">
    <li class="menu-item">menu-1</li>
    <li class="menu-item">menu-2</li>
    <li class="menu-item">menu-3</li>
    <li class="menu-item">menu-4</li>
</ul>
<input type="button" name="" id="addBtn" value="添加" />

<script>
window.onload = function() {
        var menu = document.getElementById("menu");
        menu.onclick = function(event) {
            var e = event || window.event;
            var target = e.target || e.srcElement;
            console.log(e);
            switch (target.textContent) {
                case "menu-1":
                    console.log("menu-1 被點擊了");
                    break;

                case "menu-2":
                    console.log("menu-2 被點擊了");
                    break;

                case "menu-3":
                    console.log("menu-3 被點擊了");
                    break;

                case "menu-4":
                    console.log("menu-4 被點擊了");
                    break;

                case "menu-new":
                    console.log("menu-new 被點擊了");
                    break;
            }
        }

        var addBtnEl = document.getElementById("addBtn");
        addBtnEl.onclick = function() {
            var newEl = document.createElement('li');
            newEl.innerHTML = "menu-new"
            menu.appendChild(newEl);
        }
    }
</script>

menu 列表的每個子菜單元素的事件都能正確響應,新增的 menu-new 同樣也能正確響應事件。

事件委托的好處在于,我們不用給每個元素都一一地手動添加綁定事件,避免重復低效的工作。

其次,事件委托更少得獲取 dom, 初始化元素對象和事件函數,能有效減少內存占用。

每當將事件程序指定給元素時,html 代碼和 js 代碼之間就建立了一個連接,這種連接越多,網頁就執行起來越慢,所以事件委托能有效減少連接樹,提高網頁性能。

總結

用戶與網頁的交互是通過事件進行的,事件模型分為事件冒泡和事件捕獲,事件冒泡的兼容性更好,應用更廣,同時通過事件冒泡,可以建立事件委托,提升網頁性能。

以上就是JavaScript中事件模型的詳解(代碼示例)的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 国产欧美在线一区| 免费高清一区二区三区| 国产精品动漫网站| 国产一区二区四区| 91免费网站视频| 777视频在线| 永久免费的av网站| 天天干天天综合| 亚洲福利精品视频| 日韩一级免费片| 99re精彩视频| 夜夜爽久久精品91| 中国一级大黄大黄大色毛片| 免费看污污视频| 国产又粗又猛又爽又黄的网站| 超级碰在线观看| 2022中文字幕| 狠狠干 狠狠操| 手机看片福利盒子久久| 黄色片视频在线播放| 成人一级片网站| 黑鬼大战白妞高潮喷白浆| 茄子视频成人免费观看| 91丨九色丨蝌蚪| 精品国产一区二区三区在线| 国产性生活免费视频| 久久精品国产精品亚洲色婷婷| 亚洲欧洲日产国码无码久久99| 欧美自拍小视频| 不卡中文字幕在线| 国内精品视频一区二区三区| 鲁一鲁一鲁一鲁一澡| 亚洲精品www.| 亚洲不卡中文字幕无码| 久久久久国产一区| 特级西西444| 亚洲成色www.777999| 午夜影院免费观看视频| 1024av视频| 亚洲色图欧美自拍| 国产91在线免费| 91aaa精品| 成人av一级片| 色婷婷777777仙踪林| 免费黄色特级片| 男插女免费视频| 天天操天天爽天天射| 国产美女永久无遮挡| 久久久久久蜜桃一区二区| 人人妻人人澡人人爽欧美一区双| 男人的天堂日韩| 日韩欧美视频免费在线观看| 亚洲 中文字幕 日韩 无码| 国产尤物av一区二区三区| 在线观看免费视频高清游戏推荐| 成人午夜视频在线观看免费| 爽爽爽在线观看| 成人性生生活性生交12| 日韩一级免费在线观看| 欧美a v在线播放| 奇米777在线视频| 亚州精品一二三区| 国产精品69页| 91免费视频网站在线观看| 亚洲精品蜜桃久久久久久| 亚洲自拍偷拍一区二区三区| 国产又黄又猛的视频| 欧美三级理论片| 天美星空大象mv在线观看视频| 国产精品无码av在线播放| 成年人看的毛片| 成人免费播放器| 成人免费在线视频播放| 国产aaa免费视频| 男人添女荫道口喷水视频| 草草草视频在线观看| 99re6这里有精品热视频| 日本成人性视频| 亚洲乱码日产精品bd在线观看| 影音先锋男人的网站| 国产精品美女在线播放| 国产精品12p| 丁香六月激情婷婷| 国产欧美在线一区| 亚洲精品高清无码视频| 亚洲污视频在线观看| 日本国产一级片| 青青在线视频免费观看| 亚洲熟妇国产熟妇肥婆| 自慰无码一区二区三区| 999在线免费视频| 免费网站在线观看黄| 特级西西444| 国产成人无码一二三区视频| 女人高潮一级片| 欧美黄色免费网址| 亚洲成人av免费看| 好吊色视频988gao在线观看| 成人性免费视频| 五月天开心婷婷| 国产精品无码免费专区午夜| 日韩一级片播放| 国产欧美自拍视频| 欧美xxxxx在线视频| 日韩欧美中文在线视频| 天堂…中文在线最新版在线| 天天干天天玩天天操| 国产一二三在线视频| 日韩在线不卡一区| 老司机激情视频| 三区视频在线观看| 欧美 国产 综合| 成人综合久久网| 亚洲熟妇av一区二区三区漫画| 日本黄色福利视频| av黄色在线网站| 久操手机在线视频| 久久久国产精华液999999| 欧美一级片免费播放| 潘金莲一级淫片aaaaa免费看| 久久美女福利视频| 亚洲色成人www永久在线观看| 亚洲第一区第二区第三区| 国产极品美女高潮无套久久久| 51xx午夜影福利| 中文字幕制服丝袜在线| 中文字幕 91| 欧美少妇性生活视频| 大陆极品少妇内射aaaaa| www.国产视频.com| 日日干夜夜操s8| 欧美牲交a欧美牲交aⅴ免费真| 男人添女人下面免费视频| 116极品美女午夜一级| 超碰成人在线免费观看| 男女啪啪网站视频| 成人在线观看a| 日本在线视频www| 人人爽人人av| 国产 porn| xx欧美撒尿嘘撒尿xx| 奇米影音第四色| 亚洲第一天堂久久| 一级全黄肉体裸体全过程| 懂色av一区二区三区四区五区| 久久黄色片网站| 香蕉视频免费版| 日本欧美黄色片| 少妇性饥渴无码a区免费| 黄色动漫网站入口| 色乱码一区二区三区在线| 五月天视频在线观看| 无码人妻精品一区二区蜜桃百度| 天堂8在线天堂资源bt| 国产精品国产亚洲精品看不卡| 欧美日韩在线一| 成人黄色一区二区| 成人亚洲免费视频| 丁香花在线影院观看在线播放| 日本免费a视频| 欧美午夜性生活| 警花观音坐莲激情销魂小说| 国产又黄又爽免费视频| 成人毛片一区二区| 三级在线视频观看| 丁香婷婷综合激情| 成人免费观看毛片| youjizz.com亚洲| 欧美视频在线观看网站| 亚洲欧美日本一区二区三区| 人人妻人人澡人人爽欧美一区| 黄www在线观看| 日韩精品第1页| 国产精品免费观看久久| 久久免费视频2| 无遮挡又爽又刺激的视频| 国产成年人在线观看| 国产伦精品一区二区三区四区视频_| 国产一区亚洲二区三区| 91免费国产精品| 天天插天天操天天射| 欧美激情 国产精品| 中文字幕一区二区三区四区五区人| 欧美三级一级片| 日韩一区二区高清视频| 热久久久久久久久| 手机在线看福利| 国产一区二区三区精彩视频| 中文字幕av久久| 亚洲 激情 在线| 超碰在线人人爱| 37pao成人国产永久免费视频| 成人污网站在线观看| 青少年xxxxx性开放hg| 国产女同无遮挡互慰高潮91| 免费一级特黄录像| 性刺激的欧美三级视频| www.99在线| 美女网站色免费| 我要看一级黄色大片|