深度理解onmouseover事件和onmouseout事件

来源:http://www.cnblogs.com/jingh/archive/2016/08/15/5771479.html
-Advertisement-
Play Games

對於CSS的學習到此就告一段落了,其中自己感覺在CSS的學習中最有效的方法還是去進行大量的案例仿寫,這樣我們可以學習別的人是怎樣佈局的,不會不要緊,可以多去學習借鑒一下別人的經驗啊。 這兩天又接觸了onmouseover事件和onmouseout事件,一直以為它們只是簡單的分別實現滑鼠指針移動到元素 ...


  對於CSS的學習到此就告一段落了,其中自己感覺在CSS的學習中最有效的方法還是去進行大量的案例仿寫,這樣我們可以學習別的人是怎樣佈局的,不會不要緊,可以多去學習借鑒一下別人的經驗啊。

  這兩天又接觸了onmouseover事件和onmouseout事件,一直以為它們只是簡單的分別實現滑鼠指針移動到元素上時觸發事件和在滑鼠指針移出指定的對象時觸發事件,但是突然發現這些只是對它們簡單的描述,下麵讓我們一起看看它們終究還有神馬奇怪的特性,是好還是壞呢?

  首先實現一個盒子:

      

  給這個盒子上綁定上onmouseover事件和onmouseout事件

      

  發現它們不會發生什麼問題,然後(嘿嘿,你懂得!)

      

  讓我們創建一個B元素,讓它被嵌套在A元素中,作為A的子元素

      

  我們依舊只給外層父元素A綁定onmouseover事件和onmouseout事件,你會發現發生什麼了呢?對,沒錯!當滑鼠移入移除A的子元素B的時候居然也發生了onmouseover事件和onmouseout事件!!Why?這不是我想要的!難道這時候B就不在是A的一部分了嗎?當然不是,要不也不會在移入B元素時發生onmouseover事件。這樣證明,B元素還是A不可分割的一部分啊。

  那到底是怎麼回事呢?終究還是事件冒泡搞得鬼?大家都知道常用的瀏覽器中有兩種事件流:事件冒泡和事件捕獲。讓我們看一下事件冒泡的定義:事件按照從最特定的事件目標逐級向上傳播到最不特定的事件目標(document對象)的順序。所以說當滑鼠移入移除A的子元素B的時候,B的onmouseover事件和onmouseout事件會觸發,但是它自己沒有這兩個事件啊,就把這兩個事件傳遞給了它的父元素A,A有這兩個事件所以就發生了我們看到的情況。

  有人會說那怎麼避免呢,畢竟不是所有人都會是這種需求嘛,我們只要父級元素的事件觸發就好,子級元素就讓它靜靜的當個美男子就好了。

  所以W3C在mouseover和mouseout事件中添加了relatedTarget屬性 :

  •在mouseover事件中,它表示滑鼠來自哪個元素 
  •在mouseout事件中,它指向滑鼠去往的那個元素 

  而而Microsoft在mouseover和mouseout事件中添加了兩個屬性 

  •fromElement,在mouseover事件中表示滑鼠來自哪個元素 
  •toElement,在mouseout事件中指向滑鼠去往的那個元素

  所以我們就有瞭如下代碼的實現

 1 document.getElementById('box1').onmouseover = function (e) {
 2     if (!e) e = window.event;
 3     var reltg = e.relatedTarget ? e.relatedTarget : e.fromElement;
 4     while (reltg && reltg != this) reltg = reltg.parentNode;
 5     if (reltg != this) {
 6         // 這裡可以編寫 onmouseenter 事件的處理代碼
 7         alert('111');
 8     }
 9 }
10 document.getElementById('box1').onmouseout = function (e) {
11     if (!e) e = window.event;
12     var reltg = e.relatedTarget ? e.relatedTarget : e.toElement;
13     while (reltg && reltg != this) reltg = reltg.parentNode;
14     if (reltg != this) {
15         // 這裡可以編寫 onmouseleave 事件的處理代碼
16         alert('2222');
17     }
18 }
View Code

  

  哈哈,媽媽再也不用擔心事件冒泡了!

 


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

-Advertisement-
Play Games
更多相關文章
  • 整理這幾天里寫的幾個小程式,都是迴圈練習//設N是一個四位數,它的9倍恰好是其反序數//(例如:1234的反序數是4321),求N值package Azhi;public class Job_5 {public static void main(String[] args) { for(int n= ...
  • --> List 列表中的自動添加的多餘空間長度該怎麼去除呢?...(已解決,是char 數組中的空字元) if (buffer[i] == '\r' || buffer[i] == '\n' || buffer[i] == ' ' || buffer[i] == '\t') { continue; ...
  • 執行環境(Execution Context,也稱為"執行上下文")是JavaScript中最為重要的一個概念。執行環境定義了變數或函數有權訪問的其它數據,決定了各自的行為。當JavaScript代碼執行的時候,會進入不同的執行環境,這些不同的執行環境就構成了執行環境棧。 JavaScript中主要 ...
  • <style type="text/css">html,body{height:100%;}.text{width:100%;height:30%;background:#ccc;text-align:center;position:absolute;}.text:before{content:'' ...
  • CSS常用樣式之段落樣式(行高、段落縮進、段落對齊、文字間距、文字溢出、段落換行) ...
  • PFold.js是一款摺疊紙片插件,支持定義摺疊紙牌數量、摺疊動畫效果、摺疊方向,而且還支持摺疊結束後回調方法。 線上實例 使用方法 複製 複製 參數詳解 方法Method 下載 ...
  • CSS製作三角形和按鈕 用上一篇博文中關於邊框樣式的知識點,能製作出三角形和按鈕。 我先說如何製作三角形吧,相信大家在平時逛網站的時候都會看到一些導航欄中的三角形吧,比如說: 網易首頁的頭部菜單欄中,也會有這樣的三角形 當滑鼠經過時,三角形會垂直翻轉,如下 現在我分享製作三角形的做法,主要是利用邊框 ...
  • 對AngularJS的作用域做深入剖析,該隨筆主要分為兩大板塊:JavaScript原型鏈、AngularJS作用域。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...