JS事件之自建函數bind()與相容性問題解決

来源:https://www.cnblogs.com/meow999/archive/2019/12/29/12116027.html
-Advertisement-
Play Games

JavaScript事件綁定常用方法 對象.事件 = 函數; 它只能同時為一個對象的一個事件綁定一個響應函數 不能綁定多個,如果有多個,後面的會覆蓋前面的 addEventListener() 此方法也可以為元素綁定響應函數 參數: 1. 事件的字元串(不帶on) 2. 回調函數,事件觸發時執行 3 ...


JavaScript事件綁定常用方法

  • 對象.事件 = 函數;

    它只能同時為一個對象的一個事件綁定一個響應函數
    不能綁定多個,如果有多個,後面的會覆蓋前面的

  • addEventListener()

    此方法也可以為元素綁定響應函數

    參數:

    1. 事件的字元串(不帶on)
    2. 回調函數,事件觸發時執行
    3. 是否在捕獲階段觸發事件,一般都傳false

    使用此方法可以為一個元素的同一事件綁定多個響應函數

    當事件觸發時,按綁定順序依次執行

  • attachEvent()

    IE8及以下瀏覽器不支持addEventListener()方法,但可以使用attachEvent()方法起到同樣的效果

    參數:

    1. 事件字元串(帶on)
    2. 回調函數

    此方法也可以綁定多個函數,不過函數執行順序與addEventListener()相反

  • this問題與解決
    addEventListener()中的this是綁定事件的對象
    attachEvent()中的this是window
    如果要解決相容性問題則需要統一兩個方法的this

    這裡我們用到了call()方法
    call()可以用來改變函數的this

自建函數bind()

自己定義一個函數用來給一個對象綁定事件

  • 思路

    三個參數:對象,事件,回調函數

    相容性:

    • 通過if判斷對象是否存在addEventListener方法來區分瀏覽器

    • this問題的解決

      由於傳入的回調函數是瀏覽器調用的,我們無法去操作,所以我們在attachEvent()不直接傳入回調函數,而是先定義一個匿名函數,然後在函數內部調用回調函數,並利用call方法改變this

示例代碼

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript">
            window.onload = function(){
                var btn1 = document.getElementById("btn1");
            
                bind(btn1, "click",function(){
                    alert(this);
                });
                
            };
            //定義一個函數bind(),用來為指定元素綁定事件響應函數
                /*
                 * 參數:
                 *  obj 要綁定事件的對象
                 *  eventStr 事件的字元串
                 *  func 回調函數
                 */
            function bind(obj, eventStr, func){
                //判斷是否有addEventListener()方法
                if(obj.addEventListener){
                    //大部分瀏覽器相容的方式
                    obj.addEventListener(eventStr, func, false);
                }
                else{
                    //IE8及以下    註意 on
                    //obj.attachEvent("on"+eventStr, func);//此方法this為window下麵提供解決方法
                    
                    //統一this 不直接調用func而是在匿名函數內調用
                    obj.attachEvent("on"+eventStr, function(){
                        //在匿名函數內調用回調函數 利用call()方法將this改為obj
                        func.call(obj);
                    });
                }
            };  
        </script>
    </head>
    <body>
        <button id="btn1">btn1</button>
    </body>
</html>

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

-Advertisement-
Play Games
更多相關文章
  • 1. 引子 有人在某個專註SQL的公眾號留言如下: 這個留言觸碰到一個非常敏感的問題:搞關係型資料庫還有前途嗎?現在都2020年了,區塊鏈正火熱,AI人才已經“過剩”,大數據都成了稀鬆平常的蘿蔔白菜,你卻還在搞SQL Server? 你還在搞SQL? 你就是那個被時代淘汰的人! 2. 原因 最近10 ...
  • CTS裡面SELinux相關測試中neverallow測試項占絕大多數,Android系統開發者都應該知道,在修改sepolicy時,需要確保不能違反這些neverallow規則,不然會過不了CTS。CTS中nerverallow測試都是在SELinuxNeverallowRulesTest.jav ...
  • vue.js是什麼 vue.js也稱為vue,讀音/vju/ 是一個構建用戶界面的框架 是一個輕量級MVVM(Model-view-viewModel)框架,和angular,react類似,其實就是所謂的數據雙向綁定 數據驅動+組件化的前端開發(核心思想) 通過簡單的API實現響應式的數據綁定和組 ...
  • html5中常用的結構標簽 article 文章 header 頭部 nav 導航 section 區域 aside 側邊欄 hgroup 區塊的相關信息 figure 定義一組內容及標題 figcaption 定義figure元素的標題 footer 底部 dialog 對話框 使用習慣: hea ...
  • 提交按鈕sumbit <input type="image" src="圖片路徑">//type="image"預設是sumbit,不用再添加onclick事件提交,否則會發生表單被提交兩次的情況 重置按鈕reset <input type="image" src="圖片路徑" onclick="d ...
  • 使用react-native-vector-icons時出現了很多問題,如IOS報錯unRecognized font family 'FontAwesome'以及安卓無法正常顯示圖標 ...
  • z index屬性介紹 只有設置了定位我們才會使用到該 屬性,如: 、`相對定位 絕對定位`。 定位元素預設的 屬性值是 。 如果 個定位的元素都沒有設置 屬性,後者會覆蓋到前者。 如果 個定位的元素都設置了 屬性,並且數值一樣大還是後者會覆蓋到前者。 屬性的屬性值大的就會覆蓋小,就是設置元素的層級 ...
  • position:static 忽略top/bottom/left/right或者z-index position:relative 設置相對定位的元素不會脫離文檔流 position:fixed 不會隨著視口滾動而滾動,繼承absolute的特點 position:sticky 和top屬性搭配, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...