javascript筆記7-事件

来源:http://www.cnblogs.com/mesopotamia/archive/2016/02/11/5186738.html
-Advertisement-
Play Games

事件流。 事件冒泡; 事件捕獲; 事件對象; 事件處理程式; 等


由處理程式來監聽某個動作,一旦某個動作發生,那麼處理程式就作出響應,這就是觀察者模式的簡單案例。在JavaScript中,按鈕一旦被點擊(或者其他動作,拿點擊按鈕舉例),就會有響應的處理程式進行響應,比如,點擊按鈕彈出一個對話框、滑鼠滑過按鈕會提示一行字等等,這就是JavaScript中要講的事件,也屬於經典的觀察者模式。

  1. 事件流。
    在DOM樹中,可能一個<button>元素屬於一個<div>元素的子元素,而<div>又屬於<html>的子元素。這個時候,點擊<button>這個元素,<button>就會觸發一個事件(或者一個動作),而<div>、<html>有可能也要接收到這個事件的信號。也就是說,你打了button一下,它的父親、祖父都會感受到你的打擊。這就是事件流。IE的事件流是事件冒泡流。
  2. 事件冒泡
    • IE的事件流叫做事件冒泡。即事件從最深的元素開始接收,然後逐級向上傳播。
      如:打了孫子一下,孫子感受到疼,然後父親感知,最後爺爺感知,追本溯源,直到老祖宗感知。
    • 事件冒泡的過程圖:
  3. 事件捕獲
    • 事件捕獲與事件冒泡正好相反,即從最外層開始接收事件,直到最深的元素。
      罵了姓張的人,首先張姓的祖宗感到恥辱,接著張姓的爺爺、爸爸、自己分別感受到。
    • 事件捕獲很少用到。過程圖與事件冒泡相反。
  4. DOM的事件流
    • DOM2級事件包括三個階段:事件捕獲階段、處理目標階段、事件冒泡階段。
      先發生事件捕獲,傳遞到最深一層,由具體元素接收到事件,然後冒泡並處理程式。(下麵講到第10節事件對象的target屬性時會具體解釋這一現象)
    • 過程圖:
  5. 事件處理程式
    • 件就是用戶或者瀏覽器自身執行的某種動作。而響應某個事件的函數就叫做事件處理程式。
      諸如click、load、mouseover都是事件的名字。
      事件處理程式的名字則在前面加on,比如:onclick、onload等。
    • 示例:

       1 <body>
       2     <input type="button" value="Click Me" onclick="alert('Clicked')" />
       3     <!--雙引號轉義-->
       4     <input type="button" value="Click Me" onclick="alert(&quot;Clicked&quot;)" />
       5 
       6     <script type="text/javascript">
       7         function showMessage(){
       8             alert("Hello world!");
       9         }
      10     </script>
      11     <input type="button" value="Click Me" onclick="showMessage()" />
      12     <!--防止在函數未載入時點擊-->
      13     <input type="button" value="Click Me" onclick="try{showMessage();}catch(ex){}" />
      14 </body>
      <input>是元素,
      onclick是事件處理程式的名字,跟value、type一樣,是屬性。
    • 缺點:
      • 如果<input>寫在<script>上方,函數尚未載入時,用戶可能就點擊元素,導致報錯。所以上面代碼13行進行try catch捕獲。
      • 如果要修改事件函數,那麼<input>里的onclick和<script>里的具體函數都要修改,HTML與JavaScript太緊密耦合。
  6. DOM0級事件處理程式
    • 在JavaScript中,取出要觸發的元素,把函數賦值給事件處理程式屬性。
       1 <body>
       2     <input type="button" id="myBtn" value="Click Me" />
       3     <input type="button" id="myRemoveBtn" value="Remove Event Handler" />
       4     <script type="text/javascript">
       5         var btn = document.getElementById("myBtn");
       6         //會在事件流的冒泡階段處理    
       7         btn.onclick = function(){
       8             alert(this.id);//this指示當前元素
       9         };
      10         
      11         var removeBtn = document.getElementById("myRemoveBtn");
      12         removeBtn.onclick = function(){
      13             btn.onclick = null;//刪除事件處理程式
      14         };
      15     </script>
      16 </body>
  7. DOM2級事件處理程式
    IE9及其他主流瀏覽器支持DOM2級事件處理程式。
    • DOM2級事件給元素定義了兩個方法:
      • 指定事件處理程式的操作:addEventListener();
      • 刪除事件處理程式的操作:removeEventListener();
      • DOM2級之於DOM1級最大的優勢在於,可以註冊多個事件。
        比如點擊某個按鈕,要彈出一個提示框,同時要按鈕改變顏色,這時就需要同時添加兩個事件處理程式。
      • 示例:
        <body>
            <input type="button" id="myBtn" value="Click Me" />
            <p>This example won't work in Internet Explorer.</p>
            <script type="text/javascript">
                var btn = document.getElementById("myBtn");
                btn.addEventListener("click", function(){
                    alert(this.id);
                }, false);       
                /**第三個參數預設為false,表示在冒泡階段觸發。如果為true,表示在捕獲階段觸發,true一般不會用*/
                btn.addEventListener("click", function(){
                    alert("Hello world!");
                }, false);
        
            </script>
        </body>
  8. IE事件處理程式
    • IE事件給元素定義了兩個方法:
      • 指定事件處理程式的操作:attachEvent();
      • 刪除事件處理程式的操作:detachEvent();
    • attachEvent()與DOM0級註冊事件在作用域上有不同。
      • DOM0級:作用域是所屬元素。
        即:如果在函數中使用this,this指示當前元素
      • attachEvent():作用域是全局作用域(即window)。
    • 添加多個事件處理程式,按相反的順序觸發。
  9. 跨瀏覽器的事件處理程式
    • 為保持相容,可以寫一個公共事件Util。下麵是Util中的添加事件示例:
       addHandler: function(element, type, handler){
              if (element.addEventListener){
                  element.addEventListener(type, handler, false);
              } else if (element.attachEvent){
                  element.attachEvent("on" + type, handler);
              } else {
                  element["on" + type] = handler;
              }
          }
  10. 事件對象
    • 在觸發DOM上的某個事件時,會在方法中傳入一個事件對象event(隱藏),這個對象中包含著所有與事件相關的信息。下麵列舉部分event的屬性:
      • currentTarget:當前正在處理事件的那個元素。
      • target:事件的目標。
        在事件處理程式內部,對象this始終等於currentTarget的值,
        而target則只包含事件的實際目標。
        一般情況下,currentTarget都與target相等。
        但是,假如<button>的父元素是<div>,你給<div>元素綁定了一個onclick,
        那麼這時,<div>元素是currentTarget值,而target是最終目標:<button>(向下捕獲)。
        由於按鈕<button>上並未綁定onclick事件處理程式,
        結果click事件就冒泡到了<div>,在那裡事件得到處理。

         

    • IE中的事件對象
      IE中的事件對象與其他主流瀏覽器稍微不同,比如,使用DOM0級方法添加事件處理程式時,方法中傳入的event對象是window對象的一個屬性,event事件對象的目標對象屬性為srcElement而非target等等。所以一般情況下會寫一個跨瀏覽器的Util。
  11. 事件類型
    • 上述舉例最多的是onclick事件類型,實際上,事件類型多種多樣,如:
      • UI事件:用戶與界面交互時觸發。
      • 焦點事件:元素獲得或者失去焦點時。
      • 滑鼠事件:單擊、雙擊、右擊等。
      • 滾輪事件:滑鼠滑輪滾動時。
      • 鍵盤事件:鍵盤上按下某個鍵時。
      • 等等。
    • javascript中最常用的事件就是load,頁面全部載入後,就會觸發load事件。
    • 圖像上面也可以觸發load事件,當圖像載入完畢時可以指定事件。
    • 用戶從一個頁面切換到另一個頁面,會觸發unload事件。
    • 當瀏覽器視窗大小被調整後,會觸發resize事件。
    • 鍵盤事件也經常用到。
      • keydown:用戶按下鍵盤上的任意鍵時觸發。按住不放會重覆觸發。
      • keyup:用戶釋放鍵盤上的鍵時觸發。
      • 在發生keydown或者keyup時,event對象的keyCode屬性會包含一個數字,與鍵盤上的一個特定的鍵對應。(比如:回車:13;退出:27;左箭頭:37;等等)。
      • 使用回車鍵觸發事件舉例:
        <meta http-equiv="content-type" content="text/html; charset=gb2312"/>
        <script type="text/javascript">
            function show () {
              //火狐不支持window.event,所以加入"或"條件
              var e=window.event||arguments.callee.caller.arguments[0];
              if(e.keyCode==13){
                  alert("你按下了回車");
              }
            }
        
        </script>
        <input onkeydown="show();" value="觸發鍵盤試試">
  12. 記憶體和性能
    在javascript中,添加到頁面上的事件處理程式數量將直接影響到頁面整體的運行性能。
    每個函數都是對象,都會占用記憶體。
    記憶體中的對象越多,性能就越差。
    所以要利用好事件處理程式,比如使用事件委托等。

     


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

-Advertisement-
Play Games
更多相關文章
  • 同事演示了一個.NET的的PNG異形視窗.挺漂亮.於是也想用Delphi顯擺一個. 關於Delphi用PNG做異形視窗的資料有不少.都是用GDIPlus或者TPNGImage組件載入PNG圖像做的. 好在Delphi包裝了微軟的IWICImagingFactory介面,這樣處理PNG的工作就交給操作
  • 一、模塊 1.模塊簡介 模塊是一個包含所有你定義的函數和變數的文件,其尾碼名是.py。模塊可以被別的程式引入,以使用該模塊中的函數等功能。這也是使用python標準庫的方法。 類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個
  • Java繪製笑臉小應用程式
  • 對於這個抽象工廠的相應的代碼實現 /** * 功能:抽象工廠模式的作用 適用性 1.一個系統要獨立於它的產品的創建、組合和表示時。 2.一個系統要由多個產品系列中的一個來配置時。 3.當你要強調一系列相關的產品對象的設計以便進行聯合使用時。 4.當你提供一個產品類庫,而只想顯示它們的介面而不是實現時
  • 對於本篇對於如何自定義對象、和對象相關的屬性操作不瞭解的話,可以查我對這兩篇博客。瞭解後可以更容易理解本篇文章 用構造函數創建了一個對象 obj對象的本身創建了兩個屬性 x=1 ,y=2 對象本的的兩個屬性都有屬性特征 writable是否可寫的,enumerable是否可枚舉的 configura
  • 本實例代碼可以使DIV可以手動改變大小 效果體驗:http://hovertree.com/code/css/resize.htm 代碼如下: <!DOCTYPE html> <html> <head><title>何問起</title><base target="_blank" /> <style
  • border-collapse 屬性設置表格的邊框是否被摺疊成一個單一的邊框或隔開: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <style> 5 table { 6 border-collapse: collapse; 7 } 8 </style> 9 </hea
  • 1、HTML 全局事件屬性 HTML4 的新特性之一就是可以使 HTML 事件觸發瀏覽器中的行為,比方說當用戶點擊某個 HTML 元素時啟動一段 JavaScript,在 HTML5 中還增加了一些新的事件屬性。 HTML 事件就是發生在 HTML 元素上的事情。當在 HTML 頁面中使用 Java
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...