西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)javascript|JQuery → JavaScript Event學習第五章:高級事件注冊模型

JavaScript Event學習第五章:高級事件注冊模型

相關軟件相關文章發(fā)表評論 來源:本站原創(chuàng)時間:2010/2/19 11:11:16字體大。A-A+

作者:不詳點擊:414次評論:0次標簽: Event

  • 類型:加殼脫殼大。126KB語言:中文 評分:3.5
  • 標簽:
立即下載

在這一章我會講解兩種高級時間注冊模型:W3C和微軟的。因為這兩個方法都不能跨瀏覽器,所以在現(xiàn)在看來他們的使用場合并不多。

W3C和微軟都著力于發(fā)展自己的事件注冊模型來取代Netscape的傳統(tǒng)模型。雖然對于微軟的模型我不是很感冒,但是w3c的還是不錯的,除了這個鼠標定位 的問題。不過現(xiàn)在只有小部分瀏覽器支持。

 

W3C
W3C的DOM層面事件規(guī)范注意到了傳統(tǒng)模式的問題。他對于你想在一個元素上綁定多個事件提供了一個很好的解決辦法。

W3C事件注冊模型的關鍵就是addEventListener()。你給他三個參數(shù):事件類型,要執(zhí)行的函數(shù)和一個布爾值(true或者false)我一會再解釋。把我們熟知的doSomething()函數(shù)注冊到一個元素的onclick事件上,你可以這樣做:

1 element.addEventListener('click',doSomething,false)


這種模型的魅力在于我們可以想加多少監(jiān)聽就可以加多少。如果用我們之前的傳統(tǒng)模式里面的例子,我們就可以寫成這樣:

1 element.addEventListener('click',startDragDrop,false)

2 element.addEventListener('click',spyOnUser,false)


當用戶點擊元素的時候兩個事件處理程序都會執(zhí)行。需要注意的是W3C標準不能確定哪個事件先執(zhí)行。所以你也不能認為startDragDrop()就在spyOnUser()之前執(zhí)行。

移除事件處理程序也是非常的簡單,用removeEventListener()就行了。所以:

1 element.removeEventListener('click',spyOnUser,false)


就會移除第二個事件處理程序但是第一個不會發(fā)生變化。非常漂亮的程序,完全解決了傳統(tǒng)模式下的問題。

 

 

匿名函數(shù)
在W3C模式下你依然可以使用匿名函數(shù):

1 element.addEventListener('click',function () {

2 this.style.backgroundColor = '#cc0000'

3 },false)

 

 

true或者false
true或者false是addEventListener的最后一個參數(shù),意思是你想讓你的函數(shù)在捕獲階段還是冒泡階段執(zhí)行。如果你不確定,那就使用false(冒泡階段)。

 

this
在JavaScript里this關鍵字通常指函數(shù)的所有者。如果this指向事件發(fā)生的HTML元素,那么一切都是那么的美好,你可以很簡單的做很多事情。

不幸的是,雖然this非常的強大,但是如果你不是明確的知道他怎么運作的話使用起來還是比較難的。關于這個我在另一個地方有詳細的討論。

在w3c模型下他的運作和在傳統(tǒng)模式下是一樣的:他表示現(xiàn)在正在處理事件的HTML元素。

1 element.addEventListener('click',doSomething,false);

2 another_element.addEventListener('click',doSomething,false);

3

4 function doSomething() {

5 this.style.backgroundColor = '#cc0000';

6 }


如果你把doSomething()注冊在任意一個HTML元素的click實踐上,那么當用戶點擊的時候這個元素的背景就會變成紅色。

 

 

哪個事件處理程序被注冊了呢?
現(xiàn)在這個W3C事件注冊模式有一個問題就是你不知道一個元素都有哪些事件處理程序被注冊了。在傳統(tǒng)模式下面你可以:
alert(element.onclick)
你就可以看到哪些函數(shù)注冊了,undefined就是沒有函數(shù)注冊在這個事件上。只是在最近的DOM Level 3事件中W3C才添加了一個eventListenerList來存儲已經注冊了的事件處理程序。因為太新了,鮮有瀏覽器支持。然而,問題已經解決了。

還好的是removeEventListener()不會因為你沒有注冊元素的某個事件而返回錯誤,所以你可以不用擔心的使用removeEventLister()。

 

微軟
微軟也有一個事件注冊模型。跟W3C的很像,但是有一個嚴重的缺陷。

注冊一個事件處理程序,attach到一個元素:

1 element.attachEvent('onclick',doSomething)


或者,你需要兩個事件處理程序:

1 element.attachEvent('onclick',startDragDrop)

2 element.attachEvent('onclick',spyOnUser)


移除一個也非常簡單:

1 element.detachEvent('onclick',spyOnUser)

 

 

 

缺陷
跟W3C的相比較,微軟有兩個嚴重的問題:
1、事件總是冒泡,沒有被捕捉的可能。
2、事件處理程序是被引用的,而不是拷貝的,所以this關鍵字總是指向window然后就一點用都沒有。
這兩個問題的結果就是如果一個事件冒泡了那么你是沒有可能知道哪個元素在處理事件。在后面的事件順序一章我會詳細的解釋。

而且微軟的標準只被IE支持,也不能用來跨瀏覽器。就算你只是給windows瀏覽器寫腳本也最好別用,因為冒泡問題會讓事情變得不可收拾。

    易語言
    (22)易語言
    易語言開發(fā)的軟件雖然經常會被一些安全軟件誤報為病毒,但是易語言確實是一門可學很好的編程語言,因為是全中文全可視跨平臺編程語言,全中文支持,無需跨越英語門檻。全可視化編程,支持所見即所得程序界面設計和程序流程編碼。因此易語言也可以理解為簡易的語言,跟語言語言等以英文為基礎的國外語言開發(fā)平臺,易語言學習起來更簡單了。西西本次提供了易語言.完美破解版,十天學會易語言圖解教程教程易語言零起點教程易語言個皮膚...更多>>

    相關評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字數(shù): 0/500 (您的評論需要經過審核才能顯示)