JS基礎——事件對象event,js事件event

來源:互聯網
上載者:User

JS基礎——事件對象event,js事件event

事件為什麼會是對象呢?先瞭解一下事件處理

一、事件處理

   JS在事件處理函數中提供了事件對象,協助處理滑鼠和鍵盤事件。同時還可以修改一些事件的捕獲和冒泡流的函數。

事件處理分為三部分:對象.事件處理函數=函數

document.onclick=function(){     alert(this.value); //this代表著在該範圍中離它最近的對象。}
以上事件處理中,document為對象,click是事件處理類型,onclick為事件處理函數。function()為匿名函數,用於觸發後執行。

那麼什麼是事件對象呢?當我們觸發document的click事件時,便會產生一個事件對象,這個對象中包含著這個事件的相關資訊,包括導致事件的元素、事件的類型、以及其它與特定事件相關的資訊等。這個對象是在執行事件時,瀏覽器通過函數傳遞過來的。

小例子:

document.onclick=function(){alert(arguments.length); //瀏覽器會預設傳遞一個參數alert(arguments[0]);//[object MouseEvent],如果是keydown,則為[object KeyboardEvent]}
可以看出,事件處理中,瀏覽器已經預設將一個參數傳遞過來了。而在普通函數和匿名函數中,是不傳遞event對象的。

event對象的接收:

在W3C中可以直接接受event對象,如:

input.onclick = function (evt) { //接受 event 對象,名稱不一定非要 event    alert(evt); //MouseEvent,滑鼠事件對象 IE不支援};
但是IE中,不支援直接接收,而是通過window.event來接收。

二、擷取滑鼠和鍵盤事件資訊

1、滑鼠事件

   主要是在滑鼠事件執行後,通過事件對象來擷取相關事件的一些屬性,比如左鍵還是右鍵。在按鍵時,是否按住了所規定的鍵值如ctrl,shift等常用鍵,或者滑鼠點擊的位置等相關資訊。

  通過clientX/Y來擷取滑鼠點擊的在可視地區的橫縱座標,screenX/Y可獲得在整個螢幕的橫縱座標。

關於修改鍵的一個小例子:

首先瞭解一下事件對象關於修改鍵的一些方法:


window.onload=function(){document.onclick=function(evt){var e=evt||window.event; <span style="font-family:SimSun;">//跨瀏覽器安全色事件對象</span>alert(getKey(evt));};}function getKey(evt){var e=evt||window.event;var keys=[];  <span style="font-family:SimSun;">//建立一個數組,用來存放按下的索引值</span>if(e.shiftKey) keys.push('shift');if(e.ctrlKey) keys.push('ctrl');if(e.altKey) keys.push('alt'); //單擊+Alt和360快速鍵衝突return keys;}
現在是不是對事件對象的功能有了一個大概的印象呢?看一下鍵盤事件

2、鍵盤事件

   主要應用於按鍵時,擷取按下各個鍵值的鍵碼或字元編碼。主要發生在keydown和keypress事件中

   keycode:不區分大小寫,與鍵盤上的鍵值位置一一對應。用於keydown和keyup事件

   charcode:字元編碼,區分大小寫,其實返回的就是ASCII碼。只支援keypress事件

三、事件流

 事件流包括兩種模式:冒泡和捕獲。

   1、冒泡:從裡向外逐個觸發。

   2、捕獲:從外向裡逐個觸發

  事件流是描述的從頁面接受事件的順序,當幾個都具有事件的元素層疊在一起的時候而層疊在你點擊範圍 , 並不是只有當前被點擊的元素會觸發事件 , 那麼你點擊其中一個元素的所有元素都會觸發事件。而如果我們想要只觸發其中一個事件時,此時就需要取消冒泡或捕獲。現代瀏覽器預設都是冒泡類型,所以通常只需要取消冒泡即可。

   如何取消?

function stopPro(evt) {var e = evt || window.event;window.event ? e.cancelBubble = true : e.stopPropagation(); <span style="font-family:SimSun;">//相容W3C和IE</span>}

四、事件對象中的this傳遞問題

  以上是關於事件對象的一些基礎,此外,還需注意在現代事件綁定中匿名函數通過call來進行對象冒充時,傳遞參數時,第一個參數預設傳遞給要冒充的事件對象,而從第二個參數開始才開始真正傳遞給實際要傳遞的參數。什麼意思呢?看一個小例子:

1、事件綁定函數

function addEvent(obj,type,fn){if ( typeof obj.addEventListener!='undefined'){ //W3Cobj.addEventListener(type,fn,false);}else if(typeof obj.attachEvent!='undefined'){//IEobj.attachEvent('on'+type,function(){fn.call(123<span style="font-family:SimSun;">,456,789</span>); <span style="font-family:SimSun;">//利用對象冒充來解決this傳遞問題</span>});}}
2、調用

 

window.onload=function(){    addEvent(document,'click',fn);}function fn(a,b){    alert(this);//123,預設第一個參數為傳遞要冒充的對象,為123    alert(a);//call中從第二個參數起賦值給函數的參數,456     alert(b);<span style="font-family:SimSun;">//789</span>}

總結:事件對象即是事件觸發時,瀏覽器傳遞給事件處理的一個對象,通過這個對象,我們可以獲得相應時間處理的一些相關資訊,以便於我們對接下來的操作做進一步處理。



一個js的event事件的問題

這是舊版IE和其他瀏覽器的區別。
// mousedown的時候進入這個函數function whichKey(evnt) { if (document.all) { // 舊版IE裡,evnt是空的 // 所以要使用全域event對象 x = event.button; if (x == 1) alert("你單擊了左鍵"); if (x == 2) alert("你單擊了右鍵"); } else { // 非IE瀏覽器會把event對象傳進來,可以使用evnt x = evnt.button; if (x == 1) alert("你單擊了左鍵"); if (x == 3) alert("你單擊了右鍵"); return false; }}
 
onclick事件,不可以擷取js事件來源對象,財富不多,希望幫忙看看,給些建議,

因為你onclick是直接調用check的不是attachEvent或者addEventLicenser的,在onclick裡面,this就是事件來源對象,你可以把this傳進去,check(this)
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.