JS的事件監聽機制
JS的事件監聽機制
很久以前有個叫Netscape的姑娘,她制訂了Javascript的一套事件驅動機制(即事件捕獲)
後來又有一個叫“IE”的小子,這孩子比較傲氣,他認為“憑什麼我要依照你的規則走”,於是他又創造了一套自己的規則(事件冒泡)
再後來,有個叫W3C的媒婆,想撮合這兩個孩子,將他們的特點融合在了一起,這下,事件產生的順序變成:
事件從根節點開始,逐級派送到子節點,若節點繫結了事件動作,則執行動作,然後繼續走,這個階段稱為“捕獲階段(Capture)”;
執行完捕獲階段後,事件由子節點往根節點派送,若節點繫結了事件動作,則執行動作,然後繼續走,這個階段稱為“冒泡階段(Bubble)”。
善良的Netscape以及其姐妹們都接受了媒婆的建議,採用了新的事件規則,而驕傲固執的IE小子始終按照自己的規則執行。最終使得這成為困擾前端開發人員的相容性問題之一。那麼,怎麼繫結事件呢?
由於這兩派瀏覽器的差異,其繫結的方法也不一樣,其中,遵循標準的瀏覽器使用W3C定義的addEventListener函式繫結,函式定義如下:
function addEventListener(string eventFlag, function eventFunc, [bool useCapture=false])
eventFlag : 事件名稱,如click、mouseover…
eventFunc: 繫結到事件中執行的動作
useCapture: 指定是否繫結在捕獲階段,true為是,false為否,預設為true
在事件監聽流中可以使用event.stopPropagation()來阻止事件繼續往下流
IE中使用自有的attachEvent函式繫結時間,函式定義如下:
function attachEvent(string eventFlag, function eventFunc)
eventFlag: 事件名稱,但要加上on,如onclick、onmouseover…
eventFunc: 繫結到事件中執行的動作
在事件監聽流中可以使用window.event.cacenlBubble=false來阻止事件繼續往下流
總結:addEventListener(string eventFlag, function eventFunc, [bool useCapture=false]),針對ff,chrome,safari瀏覽器,false指冒泡階段,預設為true,指捕獲階段。不過一般我們都用false。
attachEvent(string eventFlag, function eventFunc),針對ie系列、還有opera瀏覽器,少了事件處理機制的引數,只指定事件型別(別忘了on)和觸發哪個函式。
有了這些認知之後,有了大致的思路,對應的程式碼:
if(document.addEventListener){
document.addEventListener('click', hideBox, false);
在document繫結資訊框(豎的那個)隱藏函式(即隨便點html頁面的哪裡關閉展開的資訊框,這也是使用document.addEventListener的原因,要幫在文件上)
document.getElementById('status_hide').addEventListener('click', showBox, false);
在status_hide節點繫結資訊框展開(詳細的那個)函式並停止事件流(即點選豎的這個,展開詳細的那個)
document.getElementById('status_show').addEventListener('click', stopEvent, false);
因為false確定的是事件冒泡,為了防止點詳情的時候,向上冒泡到document,觸發document設定的click時hidebox方法,在status_show我們要繫結阻止事件流函式。
}
這個明白了,針對ie再寫個attachEvent的就可以了,當然ie的引數只用2個就可以了,它的時間處理機制就是冒泡不用額外設定。
最後要說說這段函式。
var stopEvent = function(event){ e = event || window.event; if(e.stopPropagation){ e.stopPropagation(); }else { e.cancelBubble = true; } };
可以確定它的作用是防止前面提到的冒泡,引發不該引發的click事件。
可是它呢function(event){e = event || window.event}
相關文章
- Apache ZooKeeper - 事件監聽機制初探Apache事件
- js 監聽事件JS事件
- Spring事件釋出與監聽機制Spring事件
- Spring 事件監聽機制及原理分析Spring事件
- Spring事件監聽機制原始碼解析Spring事件原始碼
- JS事件監聽器JS事件
- js監聽手機橫豎屏事件JS事件
- spring-event-事件監聽機制實現Spring事件
- Spring筆記(7) - Spring的事件和監聽機制Spring筆記事件
- Halo 開源專案學習(六):事件監聽機制事件
- js 監聽事件的疊加和移除JS事件
- JS的事件物件與事件機制JS事件物件
- 事件監聽事件
- 淺談JS事件機制與React事件機制JS事件React
- 扒去Spring事件監聽機制的外衣,竟然是觀察者模式Spring事件模式
- Flutter事件監聽Flutter事件
- jQuery事件監聽jQuery事件
- 監聽滑鼠事件事件
- JavaScript 事件監聽JavaScript事件
- 事件和事件監聽器事件
- Laravel 中的事件監聽Laravel事件
- passive 的事件監聽器事件
- JS 事件機制 Event LoopJS事件OOP
- SpringBoot事件監聽機制及觀察者模式/釋出訂閱模式Spring Boot事件模式
- 【spring原始碼學習】spring的事件釋出監聽機制原始碼解析Spring原始碼事件
- vue之監聽事件Vue事件
- 監聽鍵盤事件事件
- 初識事件監聽事件
- 【JS】在連續性監聽事件中,監聽當前狀態是否變化JS事件
- vue.js繫結事件監聽器(v-on)Vue.js事件
- 監聽所有模型的 saved 事件模型事件
- js--事件迴圈機制JS事件
- Ext.js4.2.1 事件機制JS事件
- Node.js 的事件迴圈機制Node.js事件
- oracle 10g 監聽安全機制的加強Oracle 10g
- js監聽鍵盤事件程式碼例項例項JS事件
- deleted事件監聽報錯delete事件
- 如何移除事件監聽器事件