摘要:隊列的實質是數組。事件在默認執行的過程中是先捕獲后冒泡,第三個參數只是讓它在什么狀態下觸發。用方法,綁定的其他事件也將不會執行。
DOM 0 知識點
//是對的 //是對的
HTML 中onclick = "要執行的代碼",一旦用戶點擊,瀏覽就eval("要執行的代碼"),這里不是屬性,不是函數,是一段代碼。
JavaScript 中,一旦用戶點擊,瀏覽器就執行X.onclick.call(X,{}),意思是onclick是一個函數屬性,而print是一個屬性,因為它的類型是對象;但下面的print()的類型是undefined。
所以在HTML 中必須傳遞一個要執行的代碼,JavaScript 中必須傳遞一個函數
那它們兩個的區別是啥呢?
xxx.onclick = function(){}只是一個屬性,所以它是唯一的,如果這時候你要綁定2個onclick事件就麻煩了。
xxx.addEventListener()它是一個隊列,先進先出,就是說先綁定的先觸發。所以它叫做事件監聽隊列,這里是排隊,xxx擁有一個隊列叫做eventlisteners,你不能直接訪問它,但你可以通過addEventListener去排個隊,如果用戶點擊了,就先觸發排在第一位的函數,排在后面的一次觸發。隊列的實質是數組。既然有入隊,那是不是也有出隊:
function f1(){ console.log(1); } function f2(){ console.log(2); } function f1(){ console.log(3); } xxx.addEventListener("click",f1); xxx.addEventListener("click",f2); xxx.removeEventListener("click",f1); xxx.addEventListener("click",f3); xxx.removeEventListener("click",f3);
最后的結果就是打?。?。
f1 在排隊的過程中移除了,f3 剛進入隊列就移除了。
前面寫輪播的時候用了one事件,它內部是怎樣的呢?
function f1(){ console.log(1); xxx.removeEventListener("click",f1); } xxx.addEventListener("click",f1);
one在函數處理時的最后一句加上離開隊列語句,on就是沒有出隊這句的,也就是說一直會執行。
JS事件中的冒泡和捕獲捕獲事件:事件從最外層父元素到最里層子元素的順序觸發,叫做捕獲事件,果document > html > body > div > p > button
冒泡事件:正好和捕獲事件相反,事件從最里層子元素到最外層父元素的順序觸發,叫做冒泡事件,如:button > p > div > body > html > document
DOM 2 中規定了同時支持捕獲事件和冒泡事件,用addEventListener()方法綁定一個事件處理函數,其語法:
target.addEventListener(type, listener, useCapture);
type:表示監聽事件類型的字符串,如clcik,前面沒有on
listener:表示監聽的對象或者一個函數
useCapture:表示是否使用捕獲,接受一個布爾值,true是觸發捕獲事件,不寫默認false觸發用冒泡事件。
事件在默認執行的過程中是先捕獲后冒泡,第三個參數只是讓它在什么狀態下觸發。如果一個節點捕獲和冒泡事件同時存在,誰在前誰先執行,和事件無關。
s1s2
當我點擊在s2上面,觸發順序是s1捕獲事件 > s2冒泡事件 > s2捕獲事件 > s1冒泡事件
事件代理:事件會在冒泡階段向上傳播到父節點,因此可以把子節點的監聽函數定義在父節點上,由父節點的監聽函數統一處理多個子元素的事件。這種方法叫做事件的代理(delegation)。
來看一個具體例子:獲取li里面的文本,用事件流方法
var ul = document.querySelector("ul"); ul.addEventListener("click",showColor,false); function showColor(e){ var x = e.target; if(x.nodeName.toLowerCase() === "li"){ console.log("The color is " + x.innerHTML); } }
如果不使用事件代理,要獲取li里面的文本應該怎么弄呢?老方法是獲取到所有子元素li,遍歷它就可以了
var colors = color-list.children for(var i=0;i阻止事件不再傳播,可以使用事件對象的stopPropagation()方法,但不會徹底消除事件,如果說綁定多個事件的話。
用stopImmediatePropagation()方法,綁定的其他事件也將不會執行。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95179.html
摘要:處于目標階段事件在上發生并處理。冒泡階段事件又傳播回文檔。不支持捕獲事件的。總結二使用事件委托新添加的元素還會有之前的事件。事件對象在觸發某個事件時,會產生一個事件對象。 js 是采用異步事件驅動的機制來響應用戶操作的,也就是說當用戶對某個html元素進行操作的時候,會產生一個事件,該事件會驅動某些函數來處理。事件源:產生事件的地方(html元素,窗口,其他等等);事件:鼠標事件,鍵盤...
摘要:而由于級標準中并沒有定義事件相關的內容,所以事件級別只包括級,級和級三種。此屬性返回當前事件所綁定的對象。自定義事件可以綁定到任意元素上,此處選擇只是為了演示方便。 前端學習的東西有很多,現代前端開發,前端工程化的東西要懂,基礎的原生js也要懂,畢竟,框架都是有生命周期的,更替非常快,然而卻有這么一個框架,它是最輕量的前端框架,每個瀏覽器都內置,它叫vanilla.js。好吧,其實va...
摘要:響應某個事件的函數就叫事件處理程序或事件偵聽器。為事件指定事件處理程序的方法主要有種。事件處理程序事件直接加在元素上。事件委托利用冒泡的原理,把事件加到父元素或祖先元素上,觸發執行效果,解決事件處理程序過多問題。事件委托優點提高性能。 JavaScript簡單入門可以看看我丑丑的Github博客JavaScript簡單入門 事件 JavaScript與HTML之間的交互是通過事件實現的...
閱讀 2755·2021-11-19 09:40
閱讀 5324·2021-09-27 14:10
閱讀 2108·2021-09-04 16:45
閱讀 1480·2021-07-25 21:37
閱讀 3003·2019-08-30 10:57
閱讀 2988·2019-08-28 17:59
閱讀 1062·2019-08-26 13:46
閱讀 1414·2019-08-26 13:27