国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript的事件機制詳解

2019-11-19 17:54:37
字體:
來源:轉載
供稿:網友

事件是將JavaScript腳本與網頁聯系在一起的主要方式,是JavaScript中最重要的主題之一,深入理解事件的工作機制以及它們對性能的影響至關重要。本文將詳細探討JavaScript的事件機制,并對比分析了瀏覽器之間的不同,具體內容包括事件流、事件處理程序綁定方式、事件對象等。

如何理解事件?

JavaScript與HTML之間的交互就是通過事件實現的。

事件:用戶或瀏覽器自身執行的某種動作,換言之,文檔或瀏覽器發生的一些特定的交互瞬間。

事件處理程序:又稱事件偵聽器,事件發生時執行的代碼段。

事件流:事件流描述的是從頁面中接收事件的順序。

兩種基本事件模型

事件冒泡:事件按照從最特定的事件目標到最不特定的事件目標(document對象)的順序觸發。

事件捕獲:事件從最不精確的對象(document 對象)開始觸發,然后到最精確。

IE9、Safari、Chrome、Opera、Firefox都是從window對象開始捕獲,冒泡到window對象

DOM事件流

同時支持 兩種基本事件模型,規定事件流包括三個階段:事件捕獲階段、處于目標階段、事件冒泡階段。

DOM事件處理程序綁定時,程序員可以自己選擇綁定事件時采用事件捕獲還是事件冒泡。

IE事件流

IE只支持事件冒泡,不支持事件捕獲。

事件處理程序綁定方式

DOM事件處理程序

DOM事件處理程序屬性名為“on”+事件名,程序作用域為元素的作用域,this指向元素本身。

方法一:將函數值賦給一個事件處理程序屬性。如下:

var btn= document.getElementById("myBtn"); btn.onclick = function{ //具體代碼段 }

注意:此種方法只能添加一個事件處理程序

方法二:通過addEventListener方法。如下:

addEventListener("事件名",事件處理程序,ture/false:在事件捕獲/冒泡階段調用模型)

對應的事件處理程序移除方法:removeEventListener,參數必須相同。

注意:此種方法,以匿名函數添加的事件處理程序無法被移除

此方法可以添加多個事件處理程序

IE事件處理程序

IE+Oprea瀏覽器

程序作用域為全局作用域,this指向window對象

添加方法:attachEvent("on+事件名",事件處理程序)

移除方法:detachEvent("on+事件名",事件處理程序)

事件對象

在觸發某個事件時,會產生一個相應的事件對象,這個對象包含所有與事件相關的信息。如:導致事件的元素、事件的類型等

DOM中的事件對象

對象名:event

常用屬性:

type:被觸發事件的類型

target:事件的目標

常用方法:

event.preventDefault:取消事件默認行為(前提:cancelable屬性值為true)

event.stopPropagation:取消事件的進一步冒泡或捕獲

IE中的事件對象

對象名:window.event

常用屬性:

type:被觸發事件的類型

scrElement:事件的目標

常用方法:

event.cancelBubble(true/false):true->取消事件默認行為
event.returnValue(true/false):false->取消事件的進一步冒泡或捕獲

綜合以上所述,整理代碼寫可跨瀏覽器的事件處理程序(構造EventUtil對象,為其添加可兼容各瀏覽器的事件處理方法),如下:

/*可跨瀏覽器的事件處理程序構造EventUtil對象,為其添加可兼容各瀏覽器的事件處理方法*/var EventUtil = {  /*添加事件處理程序*/  addHandler: function (element, type, handler) {    if (element.addEventListener) {      addEventListener(type, handler, false);    } else if (element.attachEvent) {      attachEvent("on" + type, handler);    } else {      element["on" + type] = handler;    }  },  /*移除事件處理程序*/  removeHandler: function (element, type, handler) {    if (element.removeEventListener) {      removeEventListener(type, handler, false);    } else if (element.detachEvent) {      detachEvent("on" + type, handler);    } else {      element["on" + type] = null;    }  },  /*獲得事件對象*/  getEvent: function (event) {    return event ? event : window.event;  },  /*獲得事件的目標*/  getTarget: function (event) {    return event.target || event.scrElement;  },  /*取消事件的默認行為*/  preventDefault: function (event) {    if (event.preventDefault) {      event.preventDefault;    } else {      event.returValue = false;    }  },  /*阻止事件進一步冒泡*/  stopPropagation: function (event) {    if (event.stopPropagation) {      event.stopPropagation;    } else {      event.cancelBubble = true;    }  }};

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 雅江县| 丘北县| 水富县| 秦安县| 高台县| 南陵县| 肥城市| 平舆县| 十堰市| 丰都县| 温州市| 平泉县| 高要市| 昭苏县| 蒙城县| 兰考县| 陇西县| 景宁| 东至县| 新津县| 嵊泗县| 青神县| 广南县| 贡觉县| 个旧市| 台州市| 壤塘县| 龙州县| 巴彦淖尔市| 赣榆县| 平利县| 鹤岗市| 吴旗县| 无极县| 汶上县| 土默特左旗| 津市市| 锡林浩特市| 延寿县| 布尔津县| 永济市|