JavaScript EVENT(上)

事件組成部分

觸發(fā)誰的事件:事件源

觸發(fā)什么事件:事件類型

觸發(fā)以后做什么:事件處理函數(shù)

varoDiv=document.querySelector('div')

oDiv.onclick=function() {}

// 誰來觸發(fā)事件 => oDiv => 這個(gè)事件的事件源就是 oDiv

// 觸發(fā)什么事件 => onclick => 這個(gè)事件類型就是 click

// 觸發(fā)之后做什么 => function () {} => 這個(gè)事件的處理函數(shù)

我們想要在點(diǎn)擊 div 以后做什么事情,就把我們要做的事情寫在事件處理函數(shù)里面

varoDiv=document.querySelector('div')

oDiv.onclick=function() {

console.log('你點(diǎn)擊了 div')

}

當(dāng)我們點(diǎn)擊 div 的時(shí)候,就會(huì)執(zhí)行事件處理函數(shù)內(nèi)部的代碼

每點(diǎn)擊一次,就會(huì)執(zhí)行一次事件處理函數(shù)



事件對(duì)象

什么是事件對(duì)象?

就是當(dāng)你觸發(fā)了一個(gè)事件以后,對(duì)該事件的一些描述信息

例如:

你觸發(fā)一個(gè)點(diǎn)擊事件的時(shí)候,你點(diǎn)在哪個(gè)位置了,坐標(biāo)是多少

你觸發(fā)一個(gè)鍵盤事件的時(shí)候,你按的是哪個(gè)按鈕

...

每一個(gè)事件都會(huì)有一個(gè)對(duì)應(yīng)的對(duì)象來描述這些信息,我們就把這個(gè)對(duì)象叫做 事件對(duì)象

瀏覽器給了我們一個(gè) 黑盒子,叫做 window.event,就是對(duì)事件信息的所有描述

比如點(diǎn)擊事件

你點(diǎn)在了 0,0 位置,那么你得到的這個(gè)事件對(duì)象里面對(duì)應(yīng)的就會(huì)有這個(gè)點(diǎn)位的屬性

你點(diǎn)在了 10, 10 位置,那么你得到的這個(gè)事件對(duì)象里面對(duì)應(yīng)的就會(huì)有這個(gè)點(diǎn)位的屬性

...

oDiv.onclick=function() {

console.log(window.event.X軸坐標(biāo)點(diǎn)信息)

console.log(window.event.Y軸坐標(biāo)點(diǎn)信息)

}



// 注冊(cè)點(diǎn)擊事件

oDiv.onclick=function(e) {




// 事件對(duì)象兼容寫法

e=e||window.event

console.log(e.offsetX)

console.log(e.offsetY)

?? }

</script>

</body>

相對(duì)于瀏覽器窗口你點(diǎn)擊的坐標(biāo)點(diǎn)

clientX 和 clientY

是相對(duì)于瀏覽器窗口來計(jì)算的,不管你頁面滾動(dòng)到什么情況,都是根據(jù)窗口來計(jì)算坐標(biāo)

<style>

? * {

margin:0;

padding:0;

? }

body{

width:2000px;

height:2000px;

? }

div{

width:300px;

height:300px;

padding:20px;

border:10pxsolid#333;

margin:20px0030px;

? }

</style>

<body>

<div></div>

<script>

varoDiv=document.querySelector('div')


// 注冊(cè)點(diǎn)擊事件

oDiv.onclick=function(e) {

r't? ?

e=e||window.event

console.log(e.clientX)

console.log(e.clientY)

?? }

</script>

</body>

相對(duì)于頁面你點(diǎn)擊的坐標(biāo)點(diǎn)

pageX 和 pageY

是相對(duì)于整個(gè)頁面的坐標(biāo)點(diǎn),不管有沒有滾動(dòng),都是相對(duì)于頁面拿到的坐標(biāo)點(diǎn)

<style>

? * {

margin:0;

padding:0;

? }

body{

width:2000px;

height:2000px;

? }

div{

width:300px;

height:300px;

padding:20px;

border:10pxsolid#333;

margin:20px0030px;

? }

</style>

<body>

<div></div>

<script>

varoDiv=document.querySelector('div')

// 注冊(cè)點(diǎn)擊事件

oDiv.onclick=function(e) {

// 事件對(duì)象兼容寫法

e=e||window.event

console.log(e.pageX)

console.log(e.pageY)

?? }

</script>

</body>

根據(jù)頁面左上角來說

margin-left 是 30

左邊框是 10

左右 padding 各是 20

內(nèi)容區(qū)域是 300

pageX : 300 + 20 + 20 + 10 + 30 = 380

margin-top 是 20

上邊框是 10

上下 padding 各是 20

內(nèi)容區(qū)域是 300

pageY : 300 + 20 + 20 + 10 + 20 = 270

點(diǎn)擊按鍵信息(了解)

我們的鼠標(biāo)一般都有兩個(gè)按鍵,一個(gè)左鍵一個(gè)右鍵

我們的事件對(duì)象里面也有這個(gè)信息,確定你點(diǎn)擊的是左鍵還是右鍵

我們使用 事件對(duì)象.button 來獲取信息

1 為鼠標(biāo)左鍵,2 為鼠標(biāo)右鍵


常見的事件(了解)

我們?cè)趯戫撁娴臅r(shí)候經(jīng)常用到的一些事件

大致分為幾類,瀏覽器事件 / 鼠標(biāo)事件 / 鍵盤事件 / 表單事件 / 觸摸事件

不需要都記住,但是大概要知道


瀏覽器事件

load : 頁面全部資源加載完畢

scroll : 瀏覽器滾動(dòng)的時(shí)候觸發(fā)

...


鼠標(biāo)事件

click :點(diǎn)擊事件

dblclick :雙擊事件

contextmenu : 右鍵單擊事件

mousedown :鼠標(biāo)左鍵按下事件

mouseup :鼠標(biāo)左鍵抬起事件

mousemove :鼠標(biāo)移動(dòng)

mouseover :鼠標(biāo)移入事件

mouseout :鼠標(biāo)移出事件

mouseenter :鼠標(biāo)移入事件

mouseleave :鼠標(biāo)移出事件

...


鍵盤事件

keyup : 鍵盤抬起事件

keydown : 鍵盤按下事件

keypress : 鍵盤按下再抬起事件

...


表單事件

change : 表單內(nèi)容改變事件

input : 表單內(nèi)容輸入事件

submit : 表單提交事件

...


觸摸事件

touchstart : 觸摸開始事件

touchend : 觸摸結(jié)束事件

touchmove : 觸摸移動(dòng)事件

注意:多用于移動(dòng)端布局

...


鍵盤事件

剛才了解了一下鼠標(biāo)事件,現(xiàn)在來聊聊鍵盤事件

我們?cè)阪I盤事件里面最主要的就是要做兩個(gè)事情

判斷點(diǎn)擊的是哪個(gè)按鍵

有沒有組合按鍵,shift + a / ctrl + b / ...

我們先要明確一個(gè)問題,就是是不是所有元素都可以綁定鍵盤事件

我們說事件有一個(gè)關(guān)鍵的東西是,該事件是由誰來觸發(fā)的

一個(gè) div 元素在頁面上,我怎么能讓一個(gè)鍵盤事件觸發(fā)在 div 上

所以說,我們一般只給能在頁面上選中的元素(表單元素) 和 document 來綁定鍵盤事件

document.onkeyup = function () { // code.. }

oInput.onkeyup = function () { // code.. }

確定按鍵

我們的鍵盤上每一個(gè)按鍵都有一個(gè)自己獨(dú)立的編碼

我們就是靠這個(gè)編碼來確定我們按下的是哪個(gè)按鍵的

我們通過 事件對(duì)象.keyCode 或者 事件對(duì)象.which 來獲取

為什么要有兩個(gè)呢,是因?yàn)?FireFox2.0 不支持 keycode 所以要用 which

document.keyup = function (e) {

? // 事件對(duì)象的兼容寫法

? e = e || window.event


? // 獲取鍵盤碼的兼容寫法

? var keyCode = e.keyCode || e.which

? console.log(keyCode)

}


常見的鍵盤碼(了解)

8: 刪除鍵(delete)

9: 制表符(tab)

13: 回車鍵(ebter)

16: 上檔鍵(shift)

17: ctrl 鍵

18: alt 鍵

27: 取消鍵(esc)

32: 空格鍵(space)

...


組合按鍵

組合案件最主要的就是 alt / shift / ctrl 三個(gè)按鍵

在我點(diǎn)擊某一個(gè)按鍵的時(shí)候判斷一下這三個(gè)鍵有沒有按下,有就是組合了,沒有就是沒有組合

事件對(duì)象里面也為我們提供了三個(gè)屬性

altKey :alt 鍵按下得到 true,否則得到 false

shiftKey :shift 鍵按下得到 true,否則得到 false

ctrlKey :ctrl 鍵按下得到 true,否則得到 false

我們就可以通過這三個(gè)屬性來判斷是否按下了

document.onkeyup = function (e) {

? e = e || window.event

? keyCode = e.keyCode || e.which


? if (e.altKey && keyCode === 65) {

? ? console.log('你同時(shí)按下了 alt 和 a')

? }

}



事件的綁定方式

我們現(xiàn)在給一個(gè)注冊(cè)事件都是使用 onxxx 的方式

但是這個(gè)方式不是很好,只能給一個(gè)元素注冊(cè)一個(gè)事件

一旦寫了第二個(gè)事件,那么第一個(gè)就被覆蓋了

oDiv.onclick = function () {

? console.log('我是第一個(gè)事件')

}

oDiv.onclick = function () {

? console.log('我是第二個(gè)事件')

}

當(dāng)你點(diǎn)擊的時(shí)候,只會(huì)執(zhí)行第二個(gè),第一個(gè)就沒有了

我們還有一種事件監(jiān)聽的方式去給元素綁定事件

使用 addEventListener 的方式添加

這個(gè)方法不兼容,在 IE 里面要使用 attachEvent


事件監(jiān)聽

addEventListener :? 非 IE 7 8 下使用

語法: 元素.addEventListener('事件類型', 事件處理函數(shù), 冒泡還是捕獲)

oDiv.addEventListener('click', function () {

? console.log('我是第一個(gè)事件')

}, false)

oDiv.addEventListener('click', function () {

? console.log('我是第二個(gè)事件')

}, false)

當(dāng)你點(diǎn)擊 div 的時(shí)候,兩個(gè)函數(shù)都會(huì)執(zhí)行,并且會(huì)按照你注冊(cè)的順序執(zhí)行

先打印 我是第一個(gè)事件 再打印 我是第二個(gè)事件

注意: 事件類型的時(shí)候不要寫 on,點(diǎn)擊事件就是 click,不是 onclick

attachEvent :IE 7 8 下使用

語法: 元素.attachEvent('事件類型', 事件處理函數(shù))

oDiv.attachEvent('onclick', function () {

? console.log('我是第一個(gè)事件')

})

oDiv.attachEvent('onclick', function () {

? console.log('我是第二個(gè)事件')

})

當(dāng)你點(diǎn)擊 div 的時(shí)候,兩個(gè)函數(shù)都會(huì)執(zhí)行,并且會(huì)按照你注冊(cè)的順序倒敘執(zhí)行

先打印 我是第二個(gè)事件 再打印 我是第一個(gè)事件

注意: 事件類型的時(shí)候要寫 on,點(diǎn)擊事件就行 onclick

兩個(gè)方式的區(qū)別

注冊(cè)事件的時(shí)候事件類型參數(shù)的書寫

addEventListener : 不用寫 on

attachEvent : 要寫 on

參數(shù)個(gè)數(shù)

addEventListener : 一般是三個(gè)常用參數(shù)

attachEvent : 兩個(gè)參數(shù)

執(zhí)行順序

addEventListener : 順序注冊(cè),順序執(zhí)行

attachEvent : 順序注冊(cè),倒敘執(zhí)行

適用瀏覽器

addEventListener : 非 IE 7 8 的瀏覽器

attachEvent : IE 7 8 瀏覽器

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容