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

首頁 > 開發 > JS > 正文

JavaScript事件 "事件對象"的注意要點

2024-05-06 16:27:47
字體:
來源:轉載
供稿:網友

 

這篇文章主要介紹了JavaScript事件,告訴大家"事件對象"的注意要點,感興趣的小伙伴們可以參考一下
 

在觸發DOM上的某個事件時,會產生一個事件對象event。

DOM中的事件對象

兼容DOM的瀏覽器會將一個event對象傳入到事件處理程序中。event對象包含與創建它的特定事件有關的屬性和方法。除法的事件類型不一樣,可用的屬性方法就不一樣。不過,所有的事件都會有下表列出的成員。

下面列出了 2 級 DOM 事件標準定義的屬性:

  • bubbles: 返回布爾值,指示事件是否是起泡事件類型。
  • cancelable: 返回布爾值,指示事件是否可擁可取消的默認動作。
  • currentTarget: 返回其事件監聽器觸發該事件的元素。
  • eventPhase: 返回事件傳播的當前階段。
  • target: 返回觸發此事件的元素(事件的目標節點)。
  • timeStamp: 返回事件生成的日期和時間。
  • type: 返回當前 Event 對象表示的事件的名稱。

下面列出了 2 級 DOM 事件標準定義的方法。IE 的事件模型不支持這些方法:

  • initEvent(): 初始化新創建的 Event 對象的屬性。
  • preventDefault(): 通知瀏覽器不要執行與事件關聯的默認動作。
  • stopPropagation(): 不再派發事件。

this、target、currentTarget

在事件處理程序的內部,對象this始終等于currentTarget的值,而target則只包含事件的實際目標。如果直接將事件處理程序指定給了目標元素,則this、currentTarget和target包含相同的值。如:

var btn = document.querySelector("#btn");btn.onclick=function () { console.log(event.currentTarget === this); //true console.log(event.target === this); //true}

由于click事件的目標是btn按鈕,所以這三個值是相等的。如果事件處理程序在按鈕的父節點(document.body)中,那么這些值則不相同。如:

var btn = document.querySelector("#btn");document.body.onclick=function () { console.log(event.currentTarget === document.body); //true console.log(this === document.body); //true console.log(event.target === btn); //true 因為btn沒有注冊事件處理程序,所以該click事件就冒泡到了document.body}

在這里,this和currentTarget都是document.body,因為事件處理程序是注冊到這個元素上的。但是target元素卻等于按鈕元素,因為它是click事件的真正目標。由于按鈕并沒有注冊事件處理程序,結果click事件就冒泡到了document.body,在那里事件才能得到處理。

type

在需要通過一個函數處理多個事件時,可以使用type屬性。如:

//獲取按鈕var btn = document.querySelector("#btn");//設置多個事件var handler = function() {//檢測事件的類型 switch (event.type) {  case "click":   console.log("i click it");   break;  case "mouseover":   console.log("i enter it");   break;  case "mouseout":   console.log("i leave it");   break; }}//給響應的事件賦值btn.onclick = handler;btn.onmouseover = handler;btn.onmouseout = handler;preventDefault()

要阻止特定事件的默認行為,可以使用該方法。如:

var aTags = document.getElementsByTagName("a");for (var i = 0; i < aTags.length; i++) { var currentATag = aTags[i]; currentATag.onclick = function() {  event.preventDefault(); }};

以上代碼即屏蔽了網頁上全部的a標簽超鏈接功能。要注意的是,只有cancelable屬性設置為true的事件,才可以使用preventDefault()來取消其默認行為。

stopPropagation()

立即停止事件在DOM層次中的傳播,即取消進一步的事件捕獲或冒泡。例如,直接添加到一個按鈕的事件處理程序可以調用該方法,從而避免觸發注冊在document.body上面的事件處理程序。如:

var btn = document.getElementById("btn");btn.onclick = function () { console.log("btn clicked"); // event.stopPropagation();};window.onclick = function () { console.log("clicked");};//單擊一下的結果://btn clicked//clicked

又如:

var btn = document.getElementById("btn");btn.onclick = function () { console.log("btn clicked"); event.stopPropagation();};window.onclick = function () { console.log("clicked");};//單擊一下的結果://btn clicked

eventPhase

該屬性用來確定事件當前正位于事件流的哪個階段。

1、如果是捕獲階段則等于1;
2、如果是目標對象階段則等于2;
3、如果是冒泡階段則等于3;
如:

var btn = document.getElementById("btn");document.body.addEventListener("click", function() { console.log("bodyListener" + event.eventPhase);}, true) //捕獲階段btn.onclick = function() { console.log("btn" + event.eventPhase);} //目標對象階段,實際上屬于冒泡階段(在btn上)document.body.onclick = function() { console.log("body" + event.eventPhase);} //冒泡階段(在body上)

又如:

var btn = document.getElementById("btn");document.body.addEventListener("click", function() { console.log(event.eventPhase); //1 console.log(event.currentTarget); //HTMLBodyElement}, true);btn.addEventListener("click", function() { console.log(event.eventPhase); //2 console.log(event.currentTarget); //HTMLInputElement});document.body.addEventListener("click", function() { console.log(event.eventPhase); //3 console.log(event.currentTarget); //HTMLBodyElement});

流程大概是:

document.body 捕獲階段 --> btn 目標對象階段 --> document.body 冒泡階段

以上就是本文的全部內容,希望對大家的學習有所幫助。



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 晋江市| 绥芬河市| 罗定市| 水富县| 江川县| 江门市| 大城县| 九江县| 峨山| 来凤县| 高平市| 鹿邑县| 鹤山市| 万源市| 蓬溪县| 衡阳县| 合川市| 长宁县| 淮阳县| 阳城县| 平远县| 丰台区| 万源市| 贵南县| 无极县| 饶河县| 东源县| 绥江县| 资兴市| 清镇市| 修武县| 郓城县| 得荣县| 长垣县| 元江| 治县。| 内黄县| 崇阳县| 安多县| 海伦市| 海伦市|