關於javascript事件總結和自己的心得體會
傳統事件
1、表單事件
Form元素:submit、reset
按鈕類表單元素:click
輸入、選擇框等元素:change
更換焦點:focus、blur,這兩個事件不會冒泡,focusin和focusout可以冒泡
文字輸入表單:input事件,在每次更改文字的時候都會觸發;
2、window事件
這個事件的發生與瀏覽器視窗本身,而非視窗中顯示的任何特定文件內容有關
Load事件:完全載入的時候觸發,DOMContentLoad和readystatechange是load事件的代替;單個元素也可以使用,例如img
Unload事件:當用戶離開當前文件,專項其他文件的時候會觸發,不能取消使用者狀態,另外還有
Onerror屬性:當js出錯的時候會觸發。但是他不是真正的事件處理程式。14.6
Abort事件:當網路資源因為使用者停止載入程序而導致失敗就會觸發他。
Focus和blur:當瀏覽器視窗從作業系統中得到或者失去焦點的時候會觸發
Resize:當用戶調整視窗大小
Scroll:當用戶滾動,任何overflow設定為wrap的都可以觸發
3、滑鼠事件
滑鼠事件是可以冒泡的。clientX和clientY屬性指定了滑鼠在視窗座標的位置,button和which屬性制定了按下的滑鼠鍵是哪一個,當鍵盤的輔助件按下的時候,對應的屬性
Mousemove:移動或者拖動滑鼠
Mousedown,mouseup事件:當這兩個事件加入時間佇列之後,還會觸發click事件
Click:dblckick
Mouseover和mouseout:滑鼠懸停和移出事件;對於這兩個事件有一個relatedTarget屬性制定了這個過程涉及到的其他元素,這兩個事件冒泡,為了防止冒泡,還提供了兩個不冒泡的事件mouseenter和mouseleave
Mousewheel(DOMmouseScroll):滑鼠滑輪滾動,傳遞事件物件屬性指定滾輪的大小和方向
4、鍵盤事件
無論任何元素觸發鍵盤事件,傳遞給鍵盤事件的處理程式的事件物件有keycode欄位,他指定按下或者釋放的鍵是哪個。還有altkey、ctrlkey、metakey、shiftkey
Keydown和keyup:在兩個事件之間會產生一個keypress事件,當按下鍵重複產生字元的時候,在keyup之前可能會產生多個keypress事件,他指向產生的字元而非是按下的鍵
5、DOM事件:
推出新的不冒泡事件:focusin、focusout、mouseenter、mouseleave
Mousewheel
Textinput事件,傳遞給其的事件物件不再有難以使用的數字keycode屬性,而是由指定輸入文字字串的data屬性,他也不是鍵盤的特定事件,無論是鍵盤、剪下、貼上等任何方式都可以觸發,傳遞物件中有inputmethod屬性和一組代表著文字輸入種類的常量
傳遞新的keyboardEvent物件作為引數給keydown、keyup和keypress的事件處理程式來給文字輸入事件提供更好的支援
Wheel事件除了接受普通的滑鼠事件屬性還有deltaX、deltaY和deltaZ屬性來報告三個不同的滑鼠滾軸,
6、HTML5事件:
Audio和video元素
Html5的拖放API允許javascript應用參與基於作業系統的拖放操作實現web和原生應用間的資料傳輸。
Dragstart drag dragend dragenter dragover dragleave drop
其附加屬性dataTransfer有一個datatransfer物件,他包含了關於傳輸的資料和其中可用的格式的資訊。
Html5定義了歷史管理機制,hashchange和popstate。
Html5表達驗證機制,包括驗證失敗的時候會觸發invalid時間。
Html5對離線web應用的支援;offline和online事件,無論何時瀏覽器失去或者得到網路連線都會在window物件觸發他們,標準還定義了大量其他的時間來通知應用下載進度和應用快取更新
Message事件,在接受每一個訊息的時候都會觸發;
Html5還定義了一些不在視窗、文件和文件元素的物件上觸發的事件。
7、觸控式螢幕和移動裝置事件
Orientationchange事件:旋轉這些裝置的時候產生的事件
Gesturestart和gestureend事件:用於兩個手指的縮放和旋轉手勢,開始的時候產生start,結束的時候為end,這兩個事件之間的是跟蹤手勢的過程叫做gesturechange事件佇列,這些事件傳遞的事件物件屬性scale和ratation,scale屬性是兩個手指之間當前距離和初始距離的比值,ratation屬性是指從時間開始手指旋轉的角度,以度為單位,正值表示正是真旋轉,負值表示逆時針旋轉。
Touchstart:當手指觸控到螢幕的時候胡觸發的事件
Touchmove事件:當手指移動的時候會處罰touchmove事件,而當手指離開螢幕的時候會觸發touchend事件。觸控事件不像是滑鼠事件,觸控事件並不直接告訴觸控的座標,相反,觸控事件傳遞的座標,相反觸控事件傳遞的事件物件有一個changedTouches屬性,該屬性是一個類陣列物件,其每個元素都有描述觸控的位置;
8、註冊事件的處理程式
Ie8之前為addEventListener(),而ie9支援的版本是attachEvent()不同方法
(1)addEventListener()的方法;有三個引數,第一個是要註冊的事件的名稱,但是不應該包括用於設定事件處理程式的on字首;第二個引數指的是呼叫函式;最後一個為boolean數值,預設為false,如果為true,函式將會被註冊為捕獲事件處理程式;ie5以後的版本為attachEvent和detachEvent;
(2)關於事件的取消,在屬性上註冊事件直接返回false就可以取消事件,但是在addEventListener函式中,我們要呼叫event.preventDefault();方法取消事件的預設操作;在attachEvent中將returnValue屬性值設定為false。
(3)下面講一下阻止冒泡的方法在支援addEventListener方法的瀏覽器中使用event.stopPropagation();取消事件傳播,另外還有取消後面註冊的多個註冊函式的方法為stopImmediatePropagation()方法;在不支援addEventListener的函式中將cancelBubble設定為一個true;
(4)關於addEventListener和attachEvent這兩個方法的處理函式中this代表的物件,前者是呼叫的元素,後者代表的是window;
(5)關於其作用域,正常情況下跟js一樣使用的是詞法作用域的規則,其作用域就是定義作用域,但是唯一有區別的就是在html屬性上定義的函式,因為在解析的過程中並不是直接執行的,而是轉換成了函式執行,在轉換成函式的時候使用with函式擴大了作用域,將其資料都轉變了全域性變數,作用域也提升到了全域性。