javascript必須懂之冒泡事件

来源:http://www.cnblogs.com/zhangzhicheng/archive/2016/08/07/5745246.html
-Advertisement-
Play Games

在學習javascript中,如果在事件的使用上出現一些反差效果,不良效果,如滑鼠的移入移出時,顯示你所需要的內容, 但就是沒有出現,然而你不斷的檢查代碼,逐個代碼查錯,還在瀏覽器的調試工具中調試都沒有發現錯誤,沒有看到你所 想要的錯誤,那麼這個時候你要判斷一下是不是冒泡事件帶來的不良效果了,不過在 ...


在學習javascript中,如果在事件的使用上出現一些反差效果,不良效果,如滑鼠的移入移出時,顯示你所需要的內容,

但就是沒有出現,然而你不斷的檢查代碼,逐個代碼查錯,還在瀏覽器的調試工具中調試都沒有發現錯誤,沒有看到你所

想要的錯誤,那麼這個時候你要判斷一下是不是冒泡事件帶來的不良效果了,不過在判斷之前,你是不是要知道什麼是冒泡事件呢?

接下來冒泡的解釋:

冒泡就是從里的事件源一級一級向上觸發直到window:

圖:

事件源就是你所觸發事件在位置的元素,而在這個元素觸發了事件,如圖你所觸發的元素是編號為4的物塊,而它就是事件源,

還有事件其實在你沒有編寫前就給每個元素對象自動添加上,就差你給它添加事件函數了,有個事件函數,它的事件才會有東西

執行,不是只是個空有事件,沒有事件函數的事件,這點要搞懂,不是會走進誤區!!!!

上面假設的那個冒泡就是從這個編號4的物塊一層一層向上冒泡,直到window,而它順序:

事件來源對象編號4->上級對象編號3->上上級對象編號2->上上上級對象編號1->body->document->window 

 

註意:這個冒泡只和你的HTML結構有關,不能直觀的看表現出效果,判斷它的某些子元素不會觸發冒泡給上層,只要是在

HTML結構里元素就會向上冒泡給上級。

圖:

 

代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
        }
        #div1{
            background: red;
            position: relative;
        }
        #div2{
            position: absolute;
            top: 150px;
            background: green;
        }
    </style>
</head>
<body>
    <div id="div1">
        <div id="div2"></div>
    </div>
</body>
</html>

 

從圖可以直觀看一定不知道它們的HTML結構是父子關係,所以會走進誤區,以為這兩個是獨立的塊,不會冒泡到其中一個為父級元素,但從代碼看,這個就是父子關係,所以觸發子級,會冒泡給父級再向上冒泡。

所以這個一定要搞懂。

這就是冒泡;

接下來就是冒泡事件的不良反應,比如你只想觸發某個元素的事件,但它的父級或上上級也被你觸發了,那麼你就要阻止了,

還有就是你的事件加了定時器了,這時你就要註意冒泡的不良反應了,如你想當前元素觸發事件但到後代元素後當前元素又再一次觸發它的事件,然後又調用到定時器,

然後你的效果就向不理想的現象觸發,這是一種不良情況,還有很多,等以後一一自己去體驗,而這些的不良效果,都主要阻止冒泡就可以了。

而阻止冒泡前,你要找到你所要阻止的元素,他不一定是你所需效果的元素的位置,可能是它子級的元素,所以你要先找到這個阻止源,然後才是在這個元素放阻止的

方法,一般阻止使用event.cancelBubble=true;即可,現在的主流瀏覽器都支持,但之前版本的火狐是不支持的,所以如果出現不支持那麼請做相容,event.stopPropagation();

這個是火狐之前版本支持的,當然的現在的版本也支持。

錯誤代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>冒泡</title>
    <style>
    #div1{
        width: 500px;
        height: 500px;
        margin: 0 auto;
        background: red;
    }
    #div2{
        width: 300px;
        height: 300px;
        margin: 0 auto;
        background: green;
    }
    #div3{
        width: 100px;
        height: 100px;
        margin: 0 auto;
        background: #eeeeee;
    }


    </style>
<script>
window.onload=function(){
            var oDiv=document.getElementById("div1");
                oDiv.onmouseover=function(ev){
                  ev=ev||event;
                  this.style.background="#000";
            }
            oDiv.onmouseout=function(ev){
                timer=setTimeout(function(){
                oDiv.style.background="red";    
                },1000);
                
            }
}
</script>
</head>
<body>
    <div id="div1">
        <div id="div2">
            <div id="div3"></div>
        </div>
    </div>
</body>
</html>

 

執行這些代碼一定發現問題;

阻止冒泡後修改的代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>阻止冒泡</title>
    <style>
    #div1{
        width: 500px;
        height: 500px;
        margin: 0 auto;
        background: red;
    }
    #div2{
        width: 300px;
        height: 300px;
        margin: 0 auto;
        background: green;
    }
    #div3{
        width: 100px;
        height: 100px;
        margin: 0 auto;
        background: #eeeeee;
    }


    </style>
    <script>
        window.onload=function(){
            var oDiv=document.getElementById("div1");
            var oDiv1=document.getElementById("div2");
            var oDiv2=document.getElementById("div3");
            var timer=null;
            oDiv1.onmouseover=function(){
                clearInterval(timer);
            }
            oDiv1.onmouseout=function(ev){
                ev=ev||event;
                ev.cancelBubble=true;
            }
            oDiv2.onmouseout=function(ev){
                ev=ev||event;
                ev.cancelBubble=true;
            }

            oDiv.onmouseover=function(ev){
                ev=ev||event;
                this.style.background="#000";
            }
            oDiv.onmouseout=function(ev){
                timer=setTimeout(function(){
                oDiv.style.background="red";    
                },1000);
                
            }
        }
    
    </script>
</head>
<body>
    <div id="div1">
        <div id="div2">
            <div id="div3"></div>
        </div>
    </div>
</body>
</html>

 

之於定時器的是什麼,自己去普及。

OK~大體的說了說。

冒泡有不少好處,事件委托就是其一;

事件委托:

事件委托就是使用父級為子級幹事,它的核心是利用冒泡,還有事件源屬性使用event.srcElement,它需要去相容,還有個屬性是event.target,

相容例子:

var obj=event.srcElement||event.target;

 

它有個好處是如果你動態的為父級添加子標簽,那些添加的子標簽都可以使用這些事件方法,也能觸發這些事件,就像動態的添加函數一樣,使它們都有自己的事件。

代碼:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>無標題文檔</title>
<style>
    #m1{
        width:200px;
        background:#0F6;
        overflow:hidden;
        margin:60px auto;    
        }
    li{
        width:100px;
        height:50px;
        margin:50px auto 50px;
        text-align:center;
        line-height:50px;
        border:2px solid #999;
        cursor:pointer;
    }
</style>
</head>
<ul id="m1">
    <li>111</li>
    <li>222</li>
    <li>333</li>
    <li>444</li>
    <li>555</li>
    <li>666</li>
</ul>
<input type="button" id="btn" value="添加" />
<script>
    var num=6;
    var btn=document.getElementById("btn");
    var m1=document.getElementById("m1");
    m1.onmouseover=function(){
    var e=event||window.event;
    var obj=e.srcElement||e.target;
    if(obj.nodeName.toLowerCase()=="li"){
        obj.style.background="#ff0";        
        }
        };
    m1.onmouseout=function(){
    var e=event||window.event;
    var obj=e.srcElement||e.target;
        obj.style.background="";
        };
    btn.onclick=function(){
                num++;
        var li=document.createElement("li");
        li.innerHTML=111*num;
        m1.appendChild(li);
        };
</script>
<body>
</body>
</html>

 

到此為止了。

還有事件捕獲在待定中。。。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • //fourth day to study python 24. In python , how to create funcation. we can use def to define funcation. such as: def MyFirstFuncation(): print('this ...
  • 請註意以下要點: 1、是否開啟了認證,QQ郵箱、163郵箱均要開啟認證 2、javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 25; //連接超時 解決參考:將這個屬性的true加上引 ...
  • stdafx.h: Form1.h ...
  • 1.安裝 Erlang,官網:https://www.erlang.org/ 2.安裝RabbitMQ伺服器,rabbitMQ server,官網http://www.rabbitmq.com/ 註:可以根據不同的需要到官網進行相關下載!!! 3.安裝完成之後需要對其進行配置變數: 創建新的系統變數 ...
  • 最近想用C++在windows下實現一個基本的圖像查看器功能,目前只想到了使用GDI或OpenGL兩種方式。由於實在不想用GDI的API了,就用OpenGL的方式實現了一下基本的顯示功能。用GDAL讀取圖像,這樣就能與圖像格式無關。OpenGL的glDrawPixels()函數也能實現圖像顯示,但是... ...
  • 數組的定義: JavaScript 中的數組是一種特殊的對象,用來表示偏移量的索引是該對象的屬性,索引可能是整數。然而,這些數字索引在內部被轉換為字元串類型,這是因為 JavaScript 對象中的屬性名必須是字元串。在內部被歸類為數組。由於 Array 在 JavaScript 中被當作對象,因此 ...
  • 快速排序,又稱劃分交換排序。以分治法為策略實現的快速排序演算法。 本文主要要談的是利用javascript實現in-place思想的快速排序 分治法: 在電腦科學中,分治法是建基於多項分支遞歸的一種很重要的演算法範式。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題, ...
  • 看懂此文,不再困惑於 JS 中的事件設計 今天剛在關註的微信公眾號看到的文章,關於JS事件的,寫的很詳細也很容易理解,相關的知識點都有總結到,看完就有種很舒暢的感覺,該串起來的知識點都串起來了。反正一位元組:爽。 作者:aitangyong 鏈接:blog.csdn.net/aitangyong/ar ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...