久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

深入解析JS中的事件對象Event

事件發生以后,會產生一個事件對象(Event),代表事件的狀態。下面本篇文章就來帶大家深入了解一下JS中的事件對象Event,對它做一個詳細的解讀,希望對大家有所幫助!

深入解析JS中的事件對象Event

一、什么是事件對象 Event

??每一個事件觸發時,都會產生一個與之對應的事件對象 event ,其中包含了觸發事件的元素、鍵盤鼠標的狀態、位置等等內容。

??每當用戶觸發一個事件后,JS 就會自動生成一個 event 對象,根據觸發事件的不同,這個對象包含的內容也不同,比如通過鼠標觸發點擊事件,會產生一個 MouseEvent 對象,其中包含了鼠標的位置等內容;通過鍵盤觸發事件,會產生一個 KeyboardEvent 對象其中包含按鍵相關的信息。

  • event 對象代表事件的狀態,比如觸發事件的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鍵的狀態等等;
  • event 對象是一個隱式參數,并且只在事件發生的過程中才有效;
  • event 對象根據觸發方式的不同會具有不同的屬性,也就是說某些屬性只對特定事件有效,但所有內容都是繼承自 Event 對象;
  • event 對象在 IEChrome 等瀏覽器表現不盡相同,例如說 event.target 表示觸發事件的元素,在 IE 中需要使用 event.srcElement 獲取;

Event對象本身就是一個構造函數,可以用來生成新的實例。

event = new Event(type, options);

Event構造函數接受兩個參數。第一個參數type是字符串,表示事件的名稱;第二個參數options是一個對象,表示事件對象的配置。該對象主要有下面兩個屬性。

  • bubbles:布爾值,可選,默認為false,表示事件對象是否冒泡。

  • cancelable:布爾值,可選,默認為false,表示事件是否可以被取消,即能否用Event.preventDefault()取消這個事件。一旦事件被取消,就好像從來沒有發生過,不會觸發瀏覽器對該事件的默認行為。

var ev = new Event(   'look',   {     'bubbles': true,     'cancelable': false   } ); document.dispatchEvent(ev);

上面代碼新建一個look事件實例,然后使用dispatchEvent方法觸發該事件。

注意,如果不是顯式指定bubbles屬性為true,生成的事件就只能在“捕獲階段”觸發監聽函數。

// HTML 代碼為 // <div><p>Hello</p></div> var div = document.querySelector('div'); var p = document.querySelector('p');  function callback(event) {   var tag = event.currentTarget.tagName;   console.log('Tag: ' + tag); // 沒有任何輸出 }  div.addEventListener('click', callback, false);  var click = new Event('click'); p.dispatchEvent(click);

上面代碼中,p元素發出一個click事件,該事件默認不會冒泡。div.addEventListener方法指定在冒泡階段監聽,因此監聽函數不會觸發。如果寫成div.addEventListener('click', callback, true),那么在“捕獲階段”可以監聽到這個事件。

另一方面,如果這個事件在div元素上觸發。

div.dispatchEvent(click);

那么,不管div元素是在冒泡階段監聽,還是在捕獲階段監聽,都會觸發監聽函數。因為這時div元素是事件的目標,不存在是否冒泡的問題,div元素總是會接收到事件,因此導致監聽函數生效。

二、Event 屬性

??我們在前面提到,根據觸發方式的不同 event 對象會具有不同的屬性,我們可以將其大體分為四部分:

通用屬性 (無論是通過鍵盤還是鼠標觸發都擁有的屬性)

  • bubbles 事件是否會冒泡,布爾值;

  • cancelable 事件是否具有默認行為,布爾值;
    ??默認行為指的是瀏覽器中規定的一些行為,比如 <a> 標簽點擊后會跳轉鏈接,<form> 標簽內按回車會自動提交等等。

  • currentTarget 事件處理程序當前正在處理事件的那個元素,返回一個 Element 對象;

  • defaultPrevented 事件是否取消了默認行為,布爾值;

  • detail 返回一個包含事件詳細信息的數字
    ??在 clickmousedownmouseup 事件中,該數字表示當前的點擊次數, dblclick 事件中,該數字一直為 2 。在鍵盤事件和鼠標經過事件中,該數字一直為0。

  • eventPhase 返回一個代表事件處理程序發生時所在階段的數字;
    ??0表示當前階段未發生其他事件;1表示當前事件在捕獲階段發生;2表示當前事件處于目標階段;3表示當前事件處于冒泡階段;

  • isTrusted 表示該事件是由用戶行為觸發的,還是由 JS 代碼觸發的,布爾值;
    ??當事件是由用戶行為(點擊等)觸發時,值為 true ,當事件是通過 EventTarget.dispatchEvent() 派發的時候,這個屬性的值為 false

<ul>     <li>列表1</li>     <li>列表2</li>     <li>列表3</li>     <li>列表4</li></ul><script>     document.querySelector('ul').addEventListener("click", fn1, true)      document.querySelector('ul').addEventListener("click", fn1, false)      document.querySelector("li").addEventListener("click", fn1, true)      function fn1() {         console.log(this);		// 打印當前事件對象         console.log(event.eventPhase);		// 打印     }</script>

??點擊列表1后,控制臺打印如下結果:
深入解析JS中的事件對象Event

  • target 返回觸發該事件的目標節點,返回一個 Element 對象;
    ??target 并不一定與 this 指向相同,this 指向的是當前發生事件的元素,而 target 指向的是觸發該事件的元素,可以將上方代碼中的 console.log(event.eventPhase); 換成 console.log(event.target); 來具體體驗一下兩者的不同。
    ??在 IE 瀏覽器中應使用 srcElement 來代替 target

  • type 返回觸發的事件名稱,例 clickkeydown等;

鼠標屬性

  • button 當事件被觸發時,哪個鼠標按鈕被點擊;
  • clientX 當事件被觸發時,鼠標指針的 x 軸坐標;
  • clientY 當事件被觸發時,鼠標指針的 y 軸坐標;
  • screenX 當事件被觸發時,鼠標指針的 x 軸坐標;
  • screenY 當事件被觸發時,鼠標指針的 y 軸坐標;

鍵盤屬性

  • altKey 當事件被觸發時,“Alt” 是否被按下;
  • ctrlKey 當事件被觸發時,“Ctrl” 是否被按下;
  • metaKey 當事件被觸發時,“meta” 是否被按下;
  • shiftKey 當事件被觸發時,“Shift” 是否被按下;
  • Location 返回按鍵在設備上的位置;
  • charCode 當事件被觸發時,觸發鍵值的字母代碼;
  • key 按下按鍵時返回按鍵的標識符;
  • keyCode 返回 keypress 事件觸發的鍵的值的字符代碼,或者 keydownkeyup 事件的鍵的代碼;
  • which 返回 keypress 事件觸發的鍵的值的字符代碼,或者 keydownkeyup 事件的鍵的代碼;
  • relatedTarget 返回與事件的目標節點相關的節點。

IE屬性

  • cancelBubble 如果想阻止事件冒泡,必須把該屬性設為 true
  • fromElement 對于 mouseovermouseout 事件,fromElement 引用移出鼠標的元素;
  • returnValue 等同于 defaultPrevented
  • srcElement 等同于 target
  • toElement 對于 mouseovermouseout 事件,該屬性引用移入鼠標的元素;
  • x 事件發生的位置的 x 坐標;
  • y 事件發生的位置的 y 坐標;

三、Event 方法

  • initEvent() 初始化新創建的 Event 對象的屬性;
  • preventDefault() 阻止觸發事件元素的默認行為;
  • stopPropagation() 阻止事件冒泡;

??如果想要阻止事件元素的默認行為,例如點擊 <a> 標簽時執行點擊事件,不要跳轉鏈接,需要在事件處理程序中調用 preventDefault 方法:

<a href="http://baidu.com">百度一下,你就知道</a> <script> 	document.querySelector("a").onclick = function () { 		event.preventDefault(); 		//	do something 	} </script>

??如果想要阻止事件冒泡,例如點擊子元素標簽時執行子元素的點擊事件,而不想要執行父級元素的事件處理程序,則需要調用 stopPropagation 方法:

<ul> 	<li>不要觸發 ul 的點擊事件處理程序</li> </ul> <script> 	document.querySelector("ul").onclick = function () { 		alert("事件冒泡,觸發 ul 的點擊事件") 	}  	document.querySelector("li").onclick = function () { 		event.stopPropagation(); 		// do something 	} </script>

其他相關方法

  • addEventListener() 給目標元素注冊監聽事件;
  • createEvent() 創建一個 Event 對象;
  • dispatchEvent() 將事件發送到目標元素的監聽器上;
  • handleEvent() 把任意對象注冊為事件處理程序;
  • initMouseEvent() 初始化鼠標事件對象的值;
  • initKeyboardEvent() 初始化鍵盤事件對象的值;
  • initMutationEvent() 初始變動事件和 HTML 事件對象的值;
  • initCustomEvent() 初始自定義事件對象的值;
  • removeEventListener() 刪除目標元素上的某個監聽事件;

另外關于 createEvent 方法,根據傳入參數的不同,會返回不同的 event 對象:

  • MouseEvents 創建鼠標事件對象,返回的對象中包含 initMouseEvent() 方法;
  • KeyboardEvent 創建鍵盤事件對象,返回的對象中包含 initKeyEvent() 方法;
  • KeyEventsfirefox 中創建鍵盤事件對象需要傳入該參數;
  • MutationEvents 模擬變動事件和 HTML 事件的事件對象,返回的對象中包含 initMutationEvent 方法;
  • CustomEvent 創建自定義事件對象,返回的對象中包含 initCustomEvent() 方法;

四、模擬事件

4.1 模擬鼠標事件

??我們可以通過 createEvent() 方法可以創建一個新的 event 對象,借助 initMouseEvent() 方法來對這個鼠標事件對象的值進行初始化,該方法接受十五個參數,分別與鼠標事件中的各個屬性一一對應,按照 typebubblescancelableviewdetailscreenXscreenYclientXclientYctrlKeyaltKeyshiftKey、、metaKeybuttonrelatedTarget 的順序傳入即可:

var oBtn = document.querySelector("button"); // 為 button 綁定事件處理程序 oBtn.addEventListener("click", function () {     console.log(event); })  var event = document.createEvent("MouseEvents"); // 通過 initMouseEvent() 方法初始化鼠標事件的 event 對象 event.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null); // 通過 dispatchEvent() 方法來觸發 oBtn 上綁定的點擊事件,此時瀏覽器打印的 event 對象為自定義的 event oBtn.dispatchEvent(event);

??初始化事件對象時,最重要的是前四個參數,因為瀏覽器在觸發事件時,這四個參數是必須的,而剩余的參數只有在事件處理程序中才會被使用,target 會在執行 dispatchEvent 方法時自動賦值;

4.2 模擬鍵盤事件

??同樣需要先使用 createEvent() 方法可以創建一個新的 event 對象,但需要使用 initKeyEvent 來對鍵盤事件對象的值進行初始化,該方法接收八個參數,分別于鍵盤事件對象中的各個屬性一一對應,按照 typebubblescancelableviewkeylocationmodifiersrepeat的順序傳入即可。但在 firefox 中,需要按照 typebubblescancelableviewctrlKeyaltKeyshiftKey metaKey keyCode charCode ` 的順序傳入十個參數

document.onkeydown = function () {     console.log(event); }  var event = document.createEvent("KeyboardEvent"); event.initKeyboardEvent("keydown", false, false, document.defaultView, "a", 0, "Shift", 0); document.dispatchEvent(event);

4.3 模擬其他事件

??如果想要模擬其他事件,諸如 submitfocusHTML 和變動事件,則需要通過 MutationEvents 方法來創建事件,通過 initEvent 方法來進行初始化,按照typebubblescancelablerelatedNodepreValuenewValueattrNameattrChange的順序傳入參數。

<input type="text">  <script>     var oInput = document.querySelector("input");     oInput.addEventListener("focus", function () {         this.style.background = "#ccc"     })     var event = document.createEvent("HTMLEvents");     event.initEvent("focus", true, false);     oInput.dispatchEvent(event); </script>

4.4 自定義 DOM 事件

??自定義事件不是由 DOM 原生觸發的,它的目的是讓開發人員創建自己的事件。要創建新的自定義事件,可以調用 createEvent("CustomEvent"),返回的對象有一個名為 initCustomEvent() 的方法,接收 typebubblescancelabledetail 四個參數。

var oInput = document.querySelector("input");  oInput.addEventListener("myEvent", function () { 	console.log(event); })  var event = document.createEvent("CustomEvent"); event.initCustomEvent("myEvent", true, false, "自定義事件myEvent"); oInput.dispatchEvent(event);

??上方代碼創建了一個自定義事件,事件名為 myEvent , 該事件可以向上冒泡,不可以執行在瀏覽器中的默認行為, detail 屬性的值為 自定義事件myEvent,可以在綁定該事件的元素或者元素的父級元素上綁定事件處理程序來查看 event 對象。

五、Event的兼容性處理

??主要考慮到 IE 瀏覽器與 Chrome 等瀏覽器事件對象的區別,針對下面四個屬性,需要進行特殊處理:

  • 獲得 event 對象
    var event = event || window.event;

  • 獲得 target 對象
    var target = event.target || event.srcElement;

  • 阻止瀏覽器默認行為
    event.preventDefault ? event.preventDefault() : (event.returnValue = false);

  • 阻止事件冒泡
    event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日韩精品第二页| 视频一区二区国产| 色爱av综合网| 欧美激情视频一区二区三区免费| 亚洲深爱激情| 美女少妇全过程你懂的久久| 精品国产欧美日韩| 免费视频久久| 不卡一区2区| 欧美69视频| 精品日韩毛片| 天堂网在线观看国产精品| 亚洲国产成人二区| 国产成人久久| 精品一区视频| av免费不卡国产观看| 国产精品国产三级国产在线观看| 国产精品天天看天天狠| 国产精品一区免费在线| 美国三级日本三级久久99| 免费欧美在线视频| 午夜精品影视国产一区在线麻豆| 欧美综合另类| 国产精品99在线观看| 国产精品成人a在线观看| 亚洲欧洲高清| 亚洲天堂成人| 欧美特黄一区| 噜噜噜久久亚洲精品国产品小说| 国产亚洲亚洲| 97久久亚洲| 福利欧美精品在线| 国产精品大片免费观看| 久久一区视频| 99久久99视频只有精品| 免费日韩精品中文字幕视频在线| 综合激情网...| 日本aⅴ免费视频一区二区三区| 国产探花一区二区| 国产在线观看www| 亚洲欧美日韩精品一区二区 | 性色一区二区| 国产精品极品| 色婷婷久久久| 蜜桃视频一区二区三区在线观看| 久久精品72免费观看| 久久久亚洲一区| 日韩精品亚洲aⅴ在线影院| 日韩精品一二三| 亚洲丝袜美腿一区| 精品久久影院| 婷婷五月色综合香五月| 麻豆mv在线观看| 美女久久一区| 成人羞羞视频播放网站| 欧美日本久久| 免费在线观看一区二区三区| 播放一区二区| 久久伊人亚洲| 日韩精品视频在线看| 日韩a一区二区| 在线 亚洲欧美在线综合一区| 美女免费视频一区| 日韩一区二区三区四区五区| 宅男在线一区| 精品视频一区二区三区四区五区| 黑丝一区二区三区| 老司机精品视频在线播放| 日韩视频在线一区二区三区| 国产精品99在线观看| 国产欧美一区二区三区米奇| 中文精品电影| 午夜亚洲福利在线老司机| 99精品电影| 不卡福利视频| 国产精品久久久久蜜臀| 久久久久伊人| 老司机精品视频在线播放| 国产美女亚洲精品7777| 日韩精品一页| 亚洲精品麻豆| 天堂av在线一区| 91tv亚洲精品香蕉国产一区| zzzwww在线看片免费| 中文字幕成在线观看| 黄色在线观看www| 欧美亚洲激情| 国产精品试看| 日韩一区二区三区精品| 91精品一区二区三区综合在线爱| 高潮一区二区| 91成人精品| 亚洲人www| 国产精品二区影院| 国产一区二区三区天码| 美腿丝袜亚洲三区| 国产精品日本一区二区三区在线| 欧美黑人巨大videos精品| 欧美1区2区3| 久久精品成人| 日韩高清不卡| 国产精品精品| 99国产精品久久久久久久 | 91精品亚洲| 91欧美极品| 视频一区视频二区中文字幕| 中文字幕在线看片| 国产乱论精品| 中文字幕免费精品| 不卡中文字幕| 日韩成人免费| 欧美国产极品| 日韩精品免费视频人成| 丝袜美腿亚洲一区二区图片| 欧美亚洲国产激情| 亚洲一区资源| 国产一区二区三区亚洲| 精品高清久久| 国产高清日韩| 欧美日韩一区二区高清| 日韩av不卡一区二区| 日本国产亚洲| 国产乱码精品一区二区亚洲| 日韩精品欧美成人高清一区二区| 亚州av乱码久久精品蜜桃| 国产色播av在线| 亚洲成a人片| 蜜桃精品在线| 久久久久久久久99精品大| 久久在线电影| 亚洲欧美日本国产专区一区| 免费观看久久av| 丝袜a∨在线一区二区三区不卡| 亚洲综合图色| 欧美成人一二区| av在线最新| 亚洲免费精品| 日韩精品久久久久久| 国产亚洲一区| 国模精品一区| 欧美美女一区| 日本欧美一区二区在线观看| 国产精品**亚洲精品| 色天使综合视频| 亚洲综合中文| 荡女精品导航| 亚洲欧美视频| 麻豆精品av| 亚洲免费精品| 久久影院资源站| av成人国产| 久久99精品久久久野外观看| 精品亚洲美女网站| 婷婷综合国产| 精品国产网站| 国精品一区二区三区| 最新国产精品视频| 美女免费视频一区| 午夜国产一区二区| 麻豆精品少妇| 亚洲一区日韩在线| 成人在线视频免费| 美女91精品| 啪啪国产精品| 日韩av网站在线观看| 久久高清精品| 精品日韩在线| 欧美精品中文字幕亚洲专区| 99久久婷婷| 欧美激情麻豆| 婷婷亚洲精品| 亚洲综合电影一区二区三区| 成人午夜网址| 国产激情精品一区二区三区| 在线精品视频一区| 99国产精品久久久久久久成人热| 国产精品久久久久蜜臀| 国产精品欧美大片| 亚洲精品在线国产| 午夜在线视频一区二区区别| 久久久9色精品国产一区二区三区| 美女视频免费精品| 欧美一区在线观看视频| 中文字幕日韩欧美精品高清在线| 在线亚洲国产精品网站| 日本一区二区免费高清| 久久97久久97精品免视看秋霞| 日韩在线观看一区二区三区| 美女黄网久久| 日韩影院免费视频| 亚洲精品第一| 日本在线成人| 日本综合精品一区| 欧美一区网站| 久久福利在线| 精品一区二区三区中文字幕| 91欧美在线| 99国产精品一区二区| 9久re热视频在线精品| 蜜臀精品久久久久久蜜臀|