淺析JavaScript事件

来源:http://www.cnblogs.com/controlms/archive/2017/10/30/7758010.html
-Advertisement-
Play Games

首先,我是一隻菜雞,所寫的內容都是建立在自己的理解基礎之上,若有什麼不對的地方,歡迎指正。 1.事件處理函數 事件是指自動觸發的或用戶手動觸發的對象狀態的改變。 事件處理函數:當事件觸發時,自動執行的函數 事件處理函數的本質上是對象的一個特殊屬性,而該屬性指向了一個函數。 每個元素對象都能觸發各種事 ...


首先,我是一隻菜雞,所寫的內容都是建立在自己的理解基礎之上,若有什麼不對的地方,歡迎指正。

 

1.事件處理函數

  事件是指自動觸發的或用戶手動觸發的對象狀態的改變。

  事件處理函數:當事件觸發時,自動執行的函數

  事件處理函數的本質上是對象的一個特殊屬性,而該屬性指向了一個函數。

  每個元素對象都能觸發各種事件,而每個事件都對應一個事件處理函數。

  當沒有綁定事件處理函數時,依然可以觸發事件,但是由於此時的事件綁定函數為空,所以不會執行任何操作。

  在程式執行時,將相應的函數或語句綁定給對象的某個事件處理函數,那麼一旦該對象的指定事件觸發,瀏覽器變回自動執行該對象的事件處理函數中的操作。

  綁定事件處理函數 = 為on事件名(此函數)賦值

  

2.基本事件分類

  1.滑鼠事件

    onclick  onbdclick   onmousedown  onmouseup  onmouseover(進入邊界時觸發一次)  onmouseout  onmusemove

  2.鍵盤事件

    onkeydown  onkeyup  onkeypress

  3.狀態事件

    onload  onunload  onchange(select)  onfocus(表單)  onblur(表單)  onresize  onsubmit  onreset  onerror

  

3.關於事件定義

  為特定的時間定義監聽函數有三種方式:

  1.直接在HTML中定義元素的事件的相關屬性

<標簽 on事件名="fun()/js語句">按鈕</標簽
<標簽 class="d1" onclick="fun()">
相當於
d1.onclick=function(){
    console.log(this.className);    //d1
    eval("fun()");//[window.]fun
}
結論:fun()中this指向window
//若要獲得當前目標元素對象
html:
    onxxx="fun(this)"
js中定義函數時:
    fun(elem);

  

這種方式違背了“內容和行為相互分離”的原則,應該儘量少用。

 

  2.在JavaScript中為元素的事件相關屬性賦值:

elem.on事件名=函數對象;

  這種方式實現了“內容與行為相分離”,但是元素只能綁定一個監聽函數。

 

  3.高級事件處理方式,一個事件能夠綁定多個監聽函數:

    DOM標準:elem.addEventListener(“事件名”,事件對象,是否在捕獲階段觸發)

    IE8標準:elem.attachEvent("on事件名",事件對象)

btnObj.attachEvent('onclick',function(){});        //IE
btnObj.addEventListener('click',function(){});    //DOM
...
doucument.body.attachEvent('onload',initData);    //IE
document.body.addEventListener('load',initData);    //DOM
function(){
    ...
}

  這種方式能夠為一個元素綁定多個監聽函數,但是需要註意瀏覽器相容性問題。

 小例子:逆向執行事件處理函數

html:

css:

js:

 

 結果:

  原始

  點擊最內層方塊結果:

 

3.事件周期

DOM

  解釋器創建了一個event對象之後,會按照如下過程將其在HTML元素間進行傳播:

    第一階段:事件捕獲,事件對象沿著DOM樹向下傳播(IE中的事件模型中沒有此階段)

    第二階段:目標觸發,運行事件監聽函數

    第三階段:事件冒泡,事件沿著DOM樹向上傳播

  1.事件的冒泡處理機制:

    當處於DHTML對象模型底部對象事件發生時會依次激活上面對象定義的同類事件的處理

  結果:

  

 IE

  只有兩個階段,沒有捕獲

 4.event對象

  任何事件觸發之後都會產生一個event對象

  當事件發生時,自動創建,封裝了事件信息(keyCode/screenX/screenY...)

  event對象記錄事件發生時的滑鼠位置,鍵盤按鍵狀態和觸發對象等信息,事件對象的常用屬性:

  

- secElement(IE) / target(DOM)  :    事件源對象
- eventPhase   :    事件傳播的階段
- clientX/offsetX/pageX/screenX/x    :    事件發生時的X坐標
- clientY/offsetY/pageY/screenY/y    :    事件發生時的Y坐標
- which/keyCode/charCode              :    鍵盤事件中按下的按鍵
- button    :    滑鼠哪個按鍵被按下
- cancelBubble    :    是否取消事件冒泡
- returnValue     :    是否阻止事件的預設行為

  1.目標元素對象(從一而終)

    1.HTML綁定事件方式

    

html:
onclick="fun(event)"  //event必須這樣寫,不能變

    //實際調用時,event會自動獲得當前事件的對象
js:
fun(e){
    //e中獲取到的就是當前的事件對象
    }

    2.js綁定方式

//DOM標準:自動創建event對象,預設以第一個參數傳入自定義的事件處理函數對象
//IE標準:window全局的event屬性,當事件發生時,自動創建event對象,保存在window.event中

var e=window.event||arguments[0];
var src=e.srcElement||e.target;

 

5.取消冒泡和利用冒泡

  1.取消冒泡

DOM標準:e.stopPropagation()

IE標準:e.cancelBubble=true;

用在當前的事件處理函數的末尾

if(e.stopPropagation)
{
    e.stopPropagation();
}else{
    e.cancelBubble=true;
}

  2.利用冒泡

  優化:若多個子元素中定義了相同的事件處理函數,只需要在共同的父元素上定義一次即可

  原理:事件的捕獲和冒泡不會受到程式的干擾,當觸發子元素時,會捕獲到該元素,然後在父元素觸發事件。

6.取消事件

if(e.preventDefault){
    e.preventDefault();    //DOM
}else{
    e.returnValue=false;    //IE
}

  何時取消:eg:表單提交之前,若驗證未通過,就取消之後的自動提交。

 


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

-Advertisement-
Play Games
更多相關文章
  • 版本:Dalston.SR2。官方文檔地址:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_serving_alternative_formats ...
  • 我們的筆記本電腦的充電線上通常都會有一個大磚塊似得東西,這個東西是用來將家用額定電壓220V轉換成筆記本適用的電壓,它叫做變壓器,也叫做適配器。 今天要研究的是適配器模式,名副其實,中心思想也是建立一個適配器,將兩個不同的介面或者應用連接起來,讓他們能夠協作。這種協作有時並不是主動的,就是他們彼此都 ...
  • 最近博客更新的少了,相對而言,我在自己的個人公眾號里還是挺活躍的,大家可以掃描旁邊的二維碼,或者微信搜索公眾號:“編程一生”加關註。 在分散式的年代,一個應用需要部署到多台伺服器上。那麼要查看日誌文件咋辦?一臺台的查?這年頭還真有這麼乾的。多伺服器終端交互利器有不少。最流行的是polysh。atno ...
  • 錯誤如下:Template might not exist or might not be accessible by any of the configured Template Resolvers 錯誤原因:訪問的模板不存在或者任何解析器都無法訪問該模板(錯誤為500) 解決方案:1.檢查訪問的 ...
  • 1.angular cookie的用法:(1)引入angular-cookies(2)註入ngCookies這模塊(3)想要更改cookies存儲位置的話要添加內置服務$cookiesProvider(4)註入這個內置服務可以更改cookies的預設配置項這是在做項目中,用預設的cookies登陸後 ...
  • 在平常的搜索中,我碰到過很多有趣的信息,應用程式和文檔,我把它們整理在下麵這個列表。這是收藏的遇到的有用內容的一個偉大的方式,可以在你需要的時候方便查閱。相信你會在這個列表中發現對你很有用的資料。 1. CSS Vocabulary 一個偉大的指向和點擊的小應用程式,讓你加快速度掌握 CSS 語法的 ...
  • qs庫的npm地址:https://www.npmjs.com/package/qs 功能雖然都是序列化。假設我要提交的數據如下 qs.stringify序列化結果如下name=hehe&age=10 而JSON.stringify序列化結果如下:"{"a":"hehe","age":10}" vu ...
  • 原始時代: script標簽引入javascript文件 這種方式缺乏依賴解析,全局變數空間污染,而且要保證文件引入的順序,管理比較混亂 原始時代: 模塊對象和IIFE模式 通過使用模塊對象和立即調用的函數表達式(IIFE) ,我們可以減少對全局作用域的污染。在這種方法中,我們只向全局作用域公開一個 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...