原生JS跨瀏覽器事件封裝處理

来源:http://www.cnblogs.com/liumingwang/archive/2017/04/17/6723947.html
-Advertisement-
Play Games

引子:用javascript給元素綁定事件,我們可以用addEventListener這個方法,然而這個方法有相容問題,比如在IE瀏覽器上面就無效,在IE上面要用attachEvent這個方法 一、addEventListener和attachEvent的區別: 1、addEventListener ...


引子:用javascript給元素綁定事件,我們可以用addEventListener這個方法,然而這個方法有相容問題,比如在IE瀏覽器上面就無效,在IE上面要用attachEvent這個方法

一、addEventListener和attachEvent的區別:

1、addEventListener有3個參數,attachEvent只有2個參數,預設是冒泡

2、addEventListener的第一個參數是事件類型(例如:click),attachEvent的第一個參數是事件處理函數名稱(例如:onclick)

3、this的指向不同,addEventListener中的this,指的是觸發的元素,attachEvent中的this指的window

4、為一個事件添加多個事件處理程式,執行的順序不同,addEventListener會按照添加的處理程式順序執行,attachEvent的執行順序是隨機的

二、相容性封裝處理:

舉例的HTML結構如下:
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>test001</title>
    <style type="text/css">
        .red{color:red;}
    </style>
</head>
<body class="l-bg2">
 <button id="cnt" class="btn">1111</button>
 <button class="btn">2222</button>
 <button class="btn">3333</button>

 <div class="page-coat">
     
 </div>

</body>
js代碼封裝如下:
var
eles = document.querySelectorAll('.btn') //類數組 //var eles = document.getElementById('cnt') //單個 function addEvent(ele,type,callback){ if(!ele){ return false }; if(!ele.length){ if(ele.addEventListener){ ele.addEventListener(type,callback,false) return true; }else if(ele.attachEvent){ ele['e'+type+callback] = callback; ele[type+callback] = function(){ ele['e'+type+callback](window.event) }; ele.attachEvent('on'+type,ele[type+callback]) return true } return false }else{ for(var i=0;i<ele.length;i++){ eventBody(i) } } //處理類數組元素同時綁定事件方法 function eventBody(i){ if(ele[i].addEventListener){ ele[i].addEventListener(type,callback,false); }else if(ele[i].attachEvent){ ele[i]['e'+type+callback] = callback; ele[i][type+callback] = function(){ ele[i]['e'+type+callback](window.event) } ele[i].attachEvent('on'+type,ele[i][type+callback]) } } } function func1(){ alert(this.innerText) }
//使用方法 addEvent(eles,
'click',func1)

這樣就解決瞭解決了上面提到的addEventListener和attachEvent的區別問題。

註意:1、this指向的知識,以上巧妙運用了this指向調用這個函數的對象(比如ele),來保證在IE瀏覽器中,this指向調用次事件的元素

         2、閉包的知識,把for迴圈的每個 i 值,通過閉包保存,如果是ES6,可以用let,就更方便了

以上目的為了討論學習,有不完善的地方希望大家原諒,並提出更好的方法,謝謝


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

-Advertisement-
Play Games
更多相關文章
  • (1)window對象 彈塊的方法 提示塊: window.alert("提示信息"); Code: var res = alert("xxx"); alert(res); Code: var res = alert("xxx"); alert(res); 確認塊: window.confirm(" ...
  • $.each()與$(selector).each()不同, 後者專用於jquery對象的遍歷, 前者可用於遍歷任何的集 合(無論是數組或對象),如果是數組,回調函數每次傳入數組的索引和對應的值(值亦可以通過this 關鍵字獲取,但javascript總會包裝this 值作為一個對象—儘管是一個字元 ...
  • 描述 使用ArcGIS Server 幾何服務(geometry service)來對繪製在地圖上的圖形生成緩衝區。幾何服務能夠在基於瀏覽器的應用程式中執行緩衝操作(buffering),投影要素(project feature),計算可測量值。 利用幾何服務創建緩衝區之前,需創建一個 (緩衝參數) ...
  • 這幾天在學jQuery,本身還只是一個新手,寫了一個簡單的動畫——圓形頭像的縮放。本身是用Firefox進行調試的,一切進行的很順利,縮放可以按照預期執行,結果拿到IE上去之後,發現縮放動畫失效了。後來百度了一些東西都沒有找到關鍵所在,最後Google一下,找到了很多實用的解決方法,現在在這裡總結一 ...
  • Bulma 是一個基於 Flexbox 的現代化的 CSS 框架,設計的初衷就是移動優先(Mobile First),模塊化設計,可以輕鬆用來實現各種簡單或者複製的內容佈局,瀏覽器支持:Chrome、Edge、Firefox、Internet Explorer (10+)、Opera 以及 Safa... ...
  • 任務一:零基礎HTML編碼 課程概述 作業提交截止時間:04-24 重要說明 百度前端技術學院的課程任務是由百度前端工程師專為對前端不同掌握程度的同學設計。我們儘力保證課程內容的質量以及學習難度的合理性,但即使如此,真正決定課程效果的,還是你的每一次思考和實踐。 課程多數題目的解決方案都不是唯一的, ...
  • 用 js 的 selection range 方法操作選擇區域內容和圖片,實現選擇、刪除等操作。 ...
  • 1.前臺javascript 1.在提交的js中這樣寫 document.form1.username.value=encode64(document.form1.username.value); document.form1.password.value=encode64(document.for... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...