javascript 事件和事件對(duì)象-8.23

JavaScript事件是由訪問(wèn)Web頁(yè)面的用戶引起的一系列操作毙籽,例如:用戶點(diǎn)擊构韵。當(dāng)用戶執(zhí)行某些操作的時(shí)候娘汞,再去執(zhí)行一系列代碼掺逼。

一.事件介紹

事件一般是用于瀏覽器和用戶操作進(jìn)行交互娇澎。最早是IE和Netscape Navigator中出現(xiàn),作為分擔(dān)服務(wù)器端運(yùn)算負(fù)載的一種手段铡溪。直到幾乎所有的瀏覽器都支持事件處理。而DOM2級(jí)規(guī)范開(kāi)始嘗試以一種復(fù)合邏輯的方式標(biāo)準(zhǔn)化DOM事件泪喊。IE9棕硫、Firefox、Opera袒啼、Safari和Chrome全都已經(jīng)實(shí)現(xiàn)了“DOM2級(jí)事件”模塊的核心部分哈扮。IE8之前瀏覽器仍然使用其專(zhuān)有事件模型。
JavaScript有三種事件模型:內(nèi)聯(lián)模型蚓再、腳本模型和DOM2模型滑肉。

二.內(nèi)聯(lián)模型

這種模型是最傳統(tǒng)接單的一種處理事件的方法。在內(nèi)聯(lián)模型中摘仅,事件處理函數(shù)是HTML標(biāo)簽的一個(gè)屬性靶庙,用于處理指定事件。雖然內(nèi)聯(lián)在早期使用較多娃属,但它是和HTML混寫(xiě)的六荒,并沒(méi)有與HTML分離。

//在HTML中把事件處理函數(shù)作為屬性執(zhí)行JS代碼

<input type="button" value="按鈕" onclick="alert('Mumu');"  />        //注意單雙引號(hào)

//在HTML中把事件處理函數(shù)作為屬性執(zhí)行JS函數(shù)

<input type="button" value="按鈕" onclick="box();"  />            //執(zhí)行JS的函數(shù)

PS:函數(shù)不得放到window.onload里面矾端,這樣就看不見(jiàn)了掏击。

三.腳本模型

由于內(nèi)聯(lián)模型違反了HTML與JavaScript代碼層次分離的原則。為了解決這個(gè)問(wèn)題秩铆,我們可以在JavaScript中處理事件砚亭。這種處理方式就是腳本模型。

    var input = document.getElementsByTagName('input')[0];      //得到input對(duì)象
    input.onclick = function () {                               //匿名函數(shù)執(zhí)行
        alert('Mumu');
    };

PS:通過(guò)匿名函數(shù),可以直接觸發(fā)對(duì)應(yīng)的代碼钠惩。也可以通過(guò)指定的函數(shù)名賦值的方式來(lái)執(zhí)行函數(shù)(賦值的函數(shù)名不要跟著括號(hào))柒凉。

 input.onclick = box;                      //把函數(shù)名賦值給事件處理函數(shù)

四.事件處理函數(shù)

JavaScript可以處理的事件類(lèi)型為:鼠標(biāo)事件、鍵盤(pán)事件篓跛、HTML事件膝捞。

JavaScript事件處理函數(shù)及其使用列表

事件處理函數(shù) 影響的元素 何時(shí)發(fā)生
onabort 圖像 當(dāng)圖像加載被中斷時(shí)
onblur 窗口、框架愧沟、所有表單對(duì)象 當(dāng)焦點(diǎn)從對(duì)象上移開(kāi)時(shí)
onchange 輸入框蔬咬,選擇框和文本區(qū)域 當(dāng)改變一個(gè)元素的值且失去焦點(diǎn)時(shí)
onclick 鏈接、按鈕沐寺、表單對(duì)象林艘、圖像映射區(qū)域 當(dāng)用戶單擊對(duì)象時(shí)
ondblclick 鏈接、按鈕混坞、表單對(duì)象 當(dāng)用戶雙擊對(duì)象時(shí)
ondragdrop 窗口 當(dāng)用戶將一個(gè)對(duì)象拖放到瀏覽器窗口時(shí)
onError 腳本 當(dāng)腳本中發(fā)生語(yǔ)法錯(cuò)誤時(shí)
onfocus 窗口狐援、框架、所有表單對(duì)象 當(dāng)單擊鼠標(biāo)或者將鼠標(biāo)移動(dòng)聚焦到窗口或框架時(shí)
onkeydown 文檔究孕、圖像啥酱、鏈接、表單 當(dāng)按鍵被按下時(shí)
onkeypress 文檔厨诸、圖像镶殷、鏈接、表單 當(dāng)按鍵被按下然后松開(kāi)時(shí)
onkeyup 文檔微酬、圖像绘趋、鏈接、表單 當(dāng)按鍵被松開(kāi)時(shí)
onload 主題颗管、框架集陷遮、圖像 文檔或圖像加載后
onunload 主體、框架集 文檔或框架集卸載后
onmouseout 鏈接 當(dāng)鼠標(biāo)標(biāo)移出時(shí)
onmouseover 鏈接 當(dāng)鼠標(biāo)移到時(shí)
onmove 窗口 當(dāng)瀏覽器窗口移動(dòng)時(shí)
onreset 表單復(fù)位按鈕 單擊表單的reset按鈕
onresize 窗口 當(dāng)選擇一個(gè)表單對(duì)象時(shí)
onselect 表單元素 當(dāng)選擇一個(gè)表單對(duì)象時(shí)
onsubmit 表單 當(dāng)發(fā)送表格到服務(wù)器時(shí)

PS:所有的事件處理函數(shù)都會(huì)都有兩個(gè)部分組成忙上,on + 事件名稱(chēng)拷呆,例如click事件的事件處理函數(shù)就是:onclick。在這里疫粥,我們主要談?wù)撃_本模型的方式來(lái)構(gòu)建事件茬斧,違反分離原則的內(nèi)聯(lián)模式,我們忽略掉梗逮。

對(duì)于每一個(gè)事件项秉,它都有自己的觸發(fā)范圍和方式,如果超出了觸發(fā)范圍和方式慷彤,事件處理將失效娄蔼。

1.鼠標(biāo)事件怖喻,頁(yè)面所有元素都可觸發(fā)

click:當(dāng)用戶單擊鼠標(biāo)按鈕或按下回車(chē)鍵時(shí)觸發(fā)。

    input.onclick = function () {
        alert('Mumu');
    };

dblclick:當(dāng)用戶雙擊主鼠標(biāo)按鈕時(shí)觸發(fā)岁诉。

    input.ondblclick = function () {
        alert('Mumu');
    };

mousedown:當(dāng)用戶按下了鼠標(biāo)還未彈起時(shí)觸發(fā)锚沸。

    input.onmousedown = function () {
        alert('Mumu');
    };

mouseup:當(dāng)用戶釋放鼠標(biāo)按鈕時(shí)觸發(fā)。

    input.onmouseup = function () {
        alert('Mumu');
    };

mouseover:當(dāng)鼠標(biāo)移到某個(gè)元素上方時(shí)觸發(fā)涕癣。

    input.onmouseover = function () {
        alert('Mumu');
    };

mouseout:當(dāng)鼠標(biāo)移出某個(gè)元素上方時(shí)觸發(fā)哗蜈。

    input.onmouseout = function () {
        alert('Mumu');
    };

mousemove:當(dāng)鼠標(biāo)指針在元素上移動(dòng)時(shí)觸發(fā)。

    input.onmousemove = function () {
        alert('Mumu');
    };

2.鍵盤(pán)事件

keydown:當(dāng)用戶按下鍵盤(pán)上任意鍵觸發(fā)坠韩,如果按住不放距潘,會(huì)重復(fù)觸發(fā)。

   onkeydown = function () {
       alert('Mumu');
   };

keypress:當(dāng)用戶按下鍵盤(pán)上的字符鍵觸發(fā)只搁,如果按住不放音比,會(huì)重復(fù)觸發(fā)。

    onkeypress = function () {
        alert('Mumu');
    };

keyup:當(dāng)用戶釋放鍵盤(pán)上的鍵觸發(fā)氢惋。

    onkeyup = function () {
        alert('Mumu');
    };

3.HTML事件

load:當(dāng)頁(yè)面完全加載后在window上面觸發(fā)洞翩,或當(dāng)框架集加載完畢后在框架集上觸發(fā)。

window.onload = function () {
    alert('Mumu');
};

unload:當(dāng)頁(yè)面完全卸載后在window上面觸發(fā)焰望,或當(dāng)框架集卸載后在框架集上觸發(fā)菱农。

window.onunload = function () {
    alert('Mumu');
};

select:當(dāng)用戶選擇文本框(input或textarea)中的一個(gè)或多個(gè)字符觸發(fā)。

   input.onselect = function () {
       alert('Mumu');
   };

change:當(dāng)文本框(input或textarea)內(nèi)容改變且失去焦點(diǎn)后觸發(fā)柿估。

    input.onchange = function () {
        alert('Mumu');
    };

focus:當(dāng)頁(yè)面或者元素獲得焦點(diǎn)時(shí)在window及相關(guān)元素上面觸發(fā)。

    input.onfocus = function () {
        alert('Mumu');
    };

blur:當(dāng)頁(yè)面或元素失去焦點(diǎn)時(shí)在window及相關(guān)元素上觸發(fā)陷猫。

input.onblur = function () {
        alert('Mumu');
    };

submit:當(dāng)用戶點(diǎn)擊提交按鈕在<form>元素上觸發(fā)秫舌。

    form.onsubmit = function () {
        alert('Mumu');
    };

reset:當(dāng)用戶點(diǎn)擊重置按鈕在<form>元素上觸發(fā)。

form.onreset= function () {
        alert('Mumu');
    };

resize:當(dāng)窗口或框架的大小變化時(shí)在window或框架上觸發(fā)绣檬。

    window.onresize = function () {
        alert('Mumu');
    };

scroll:當(dāng)用戶滾動(dòng)帶滾動(dòng)條的元素時(shí)觸發(fā)足陨。

    window.onscroll = function () {
        alert('Mumu');
    };

事件對(duì)象

學(xué)習(xí)要點(diǎn):

  1. 事件對(duì)象
  2. 鼠標(biāo)事件
  3. 鍵盤(pán)事件
  4. W3C與IE

一.事件對(duì)象
事件處理函數(shù)的一個(gè)標(biāo)準(zhǔn)特性是,以某些方式訪問(wèn)的事件對(duì)象包含有關(guān)于當(dāng)前事件的上下文信息娇未。
事件處理三部分組成:對(duì)象.事件處理函數(shù)=函數(shù)墨缘。例如:?jiǎn)螕粑臋n任意處。

   document.onclick = function () {
       alert('Mumu');
   };

PS:以上程序的名詞解釋?zhuān)篶lick表示一個(gè)事件類(lèi)型零抬,單擊镊讼。onclick表示一個(gè)事件處理函數(shù)或綁定對(duì)象的屬性(或者叫事件監(jiān)聽(tīng)器、偵聽(tīng)器)平夜。document表示一個(gè)綁定的對(duì)象蝶棋,用于觸發(fā)某個(gè)元素區(qū)域。function()匿名函數(shù)是被執(zhí)行的函數(shù)忽妒,用于觸發(fā)后執(zhí)行玩裙。

除了用匿名函數(shù)的方法作為被執(zhí)行的函數(shù)兼贸,也可以設(shè)置成獨(dú)立的函數(shù)。

    document.onclick = box;                     //直接賦值函數(shù)名即可吃溅,無(wú)須括號(hào)
    function box() {
        alert('Mumu');
    }

this關(guān)鍵字和上下文
在面向?qū)ο竽钦挛覀兞私獾剑涸谝粋€(gè)對(duì)象里溶诞,由于作用域的關(guān)系,this代表著離它最近對(duì)象决侈。

    var input = document.getElementsByTagName('input')[0];
    input.onclick = function () {
        alert(this.value);                  //HTMLInputElement螺垢,this表示input對(duì)象
    };

從上面的拆分,我們并沒(méi)有發(fā)現(xiàn)本章的重點(diǎn):事件對(duì)象颜及。那么事件對(duì)象是什么甩苛?它在哪里呢?當(dāng)觸發(fā)某個(gè)事件時(shí)俏站,會(huì)產(chǎn)生一個(gè)事件對(duì)象讯蒲,這個(gè)對(duì)象包含著所有與事件有關(guān)的信息。包括導(dǎo)致事件的元素肄扎、事件的類(lèi)型墨林、以及其它與特定事件相關(guān)的信息。

事件對(duì)象犯祠,我們一般稱(chēng)作為event對(duì)象旭等,這個(gè)對(duì)象是瀏覽器通過(guò)函數(shù)把這個(gè)對(duì)象作為參數(shù)傳遞過(guò)來(lái)的。那么首先衡载,我們就必須驗(yàn)證一下搔耕,在執(zhí)行函數(shù)中沒(méi)有傳遞參數(shù),是否可以得到隱藏的參數(shù)痰娱。

function box() {                            //普通空參函數(shù)
        alert(arguments.length);                    //0弃榨,沒(méi)有得到任何傳遞的參數(shù)
    }

input.onclick = function () {                   //事件綁定的執(zhí)行函數(shù)
        alert(arguments.length);                    //1,得到一個(gè)隱藏參數(shù)
    };

通過(guò)上面兩組函數(shù)中梨睁,我們發(fā)現(xiàn)鲸睛,通過(guò)事件綁定的執(zhí)行函數(shù)是可以得到一個(gè)隱藏參數(shù)的。說(shuō)明坡贺,瀏覽器會(huì)自動(dòng)分配一個(gè)參數(shù)官辈,這個(gè)參數(shù)其實(shí)就是event對(duì)象。

    input.onclick = function () {
        alert(arguments[0]);                    //MouseEvent遍坟,鼠標(biāo)事件對(duì)象
    };

上面這種做法比較累拳亿,那么比較簡(jiǎn)單的做法是,直接通過(guò)接收參數(shù)來(lái)得到即可政鼠。

input.onclick = function (evt) {                //接受event對(duì)象风瘦,名稱(chēng)不一定非要event
        alert(evt);                             //MouseEvent,鼠標(biāo)事件對(duì)象
    };

直接接收event對(duì)象公般,是W3C的做法万搔,IE不支持胡桨,IE自己定義了一個(gè)event對(duì)象,直接在window.event獲取即可瞬雹。

    input.onclick = function (evt) {
        var e = evt || window.event;                //實(shí)現(xiàn)跨瀏覽器兼容獲取event對(duì)象
        alert(e);
    };

二.鼠標(biāo)事件

鼠標(biāo)事件是Web上面最常用的一類(lèi)事件昧谊,畢竟鼠標(biāo)還是最主要的定位設(shè)備。那么通過(guò)事件對(duì)象可以獲取到鼠標(biāo)按鈕信息和屏幕坐標(biāo)獲取等酗捌。

1. 可視區(qū)及屏幕坐標(biāo)

事件對(duì)象提供了兩組來(lái)獲取瀏覽器坐標(biāo)的屬性呢诬,一組是頁(yè)面可視區(qū)左邊,另一組是屏幕坐標(biāo)胖缤。

坐標(biāo)屬性
屬性 說(shuō)明
clientX 可視區(qū)X坐標(biāo)尚镰,距離左邊框的位置
clientY 可視區(qū)Y坐標(biāo),距離上邊框的位置
screenX 屏幕區(qū)X坐標(biāo)哪廓,距離左屏幕的位置
screenY 屏幕區(qū)Y坐標(biāo)狗唉,距離上屏幕的位置

    document.onclick = function (evt) {         
        var e = evt || window.event;
        alert(e.clientX + ',' + e.clientY);
        alert(e.screenX + ',' + e.screenY);
    };

2.修改鍵

有時(shí),我們需要通過(guò)鍵盤(pán)上的某些鍵來(lái)配合鼠標(biāo)來(lái)觸發(fā)一些特殊的事件涡真。這些鍵為:Shfit分俯、Ctrl、Alt和Meat(Windows中就是Windows鍵哆料,蘋(píng)果機(jī)中是Cmd鍵)缸剪,它們經(jīng)常被用來(lái)修改鼠標(biāo)事件和行為,所以叫修改鍵东亦。

修改鍵屬性
屬性 說(shuō)明
shiftKey 判斷是否按下了Shfit鍵
ctrlKey 判斷是否按下了ctrlKey鍵
altKey 判斷是否按下了alt鍵
metaKey 判斷是否按下了windows鍵杏节,IE不支持

三.鍵盤(pán)事件

1.鍵碼
在發(fā)生keydown和keyup事件時(shí),event對(duì)象的keyCode屬性中會(huì)包含一個(gè)代碼典阵,與鍵盤(pán)上一個(gè)特定的鍵對(duì)應(yīng)拢锹。對(duì)數(shù)字字母字符集,keyCode屬性的值與ASCII碼中對(duì)應(yīng)小寫(xiě)字母或數(shù)字的編碼相同萄喳。字母中大小寫(xiě)不影響。

    document.onkeydown = function (evt) {
        alert(evt.keyCode);                     //按任意鍵蹋半,得到相應(yīng)的keyCode
    };

不同的瀏覽器在keydown和keyup事件中他巨,會(huì)有一些特殊的情況:
在Firefox和Opera中,分號(hào)鍵時(shí)keyCode值為59减江,也就是ASCII中分號(hào)的編碼染突;而IE和Safari返回186,即鍵盤(pán)中按鍵的鍵碼辈灼。
PS:其他一些特殊情況由于瀏覽器版本太老和市場(chǎng)份額太低份企,這里不做補(bǔ)充。

2.字符編碼
Firefox巡莹、Chrome和Safari的event對(duì)象都支持一個(gè)charCode屬性司志,這個(gè)屬性只有在發(fā)生keypress事件時(shí)才包含值甜紫,而且這個(gè)值是按下的那個(gè)鍵所代表字符的ASCII編碼。此時(shí)的keyCode通常等于0或者也可能等于所按鍵的編碼骂远。IE和Opera則是在keyCode中保存字符的ASCII編碼囚霸。

function getCharCode(evt) {
    var e = evt || window.event;
    if (typeof e.charCode == 'number') {
        return e.charCode;
    } else {
        return e.keyCode;
    }
}

PS:可以使用String.fromCharCode()將ASCII編碼轉(zhuǎn)換成實(shí)際的字符。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末激才,一起剝皮案震驚了整個(gè)濱河市拓型,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘸恼,老刑警劉巖劣挫,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異东帅,居然都是意外死亡压固,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)冰啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)邓夕,“玉大人,你說(shuō)我怎么就攤上這事阎毅》俑眨” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵扇调,是天一觀的道長(zhǎng)矿咕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)狼钮,這世上最難降的妖魔是什么碳柱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮熬芜,結(jié)果婚禮上莲镣,老公的妹妹穿的比我還像新娘。我一直安慰自己涎拉,他們只是感情好瑞侮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鼓拧,像睡著了一般半火。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上季俩,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天钮糖,我揣著相機(jī)與錄音,去河邊找鬼酌住。 笑死店归,一個(gè)胖子當(dāng)著我的面吹牛阎抒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娱节,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼挠蛉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了肄满?” 一聲冷哼從身側(cè)響起谴古,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稠歉,沒(méi)想到半個(gè)月后掰担,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怒炸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年带饱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阅羹。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勺疼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捏鱼,到底是詐尸還是另有隱情执庐,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布导梆,位于F島的核電站轨淌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏看尼。R本人自食惡果不足惜递鹉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望藏斩。 院中可真熱鬧躏结,春花似錦、人聲如沸狰域。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)北专。三九已至,卻和暖如春旬陡,著一層夾襖步出監(jiān)牢的瞬間拓颓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工描孟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驶睦,地道東北人砰左。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像场航,于是被迫代替她去往敵國(guó)和親缠导。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容