-
Mouse Event
- 透過event.type來取得的事件名稱沒有on開頭
-
onmousedown
- 按下mouse按鍵,不論左右鍵
-
onmousemove
- 移動mouse
-
onmouseout
- mouse指標離開HTML標籤
-
onmouseover
- mouse指標進入HTML標籤
-
onmouseup
- 放開mouse按鍵
-
onclick
- 按一下mouse左鍵
-
ondblclick
- 按二下mouse左鍵
-
按一下Mouse
- mousedown --> mouseup --> click
-
隱藏Mouse右鍵選單
- Mouse右鍵會觸發一個contextmenu事件
- function blockMenu(Evt){
if(window.event){
Evt = window.event;
Evt.returnValue = false;//取消IE預設事件
}else
Evt.preventDefault();//取消DOM預設事件
}
document.oncontextmenu = blockMenu;
-
Keyboard Event
- 透過event.type來取得的事件名稱沒有on開頭
-
onkeydown
- 按下鍵盤按鍵
-
onkeypress
- 在keydown與keyup之間的事件,或是按著不放時所觸發
-
onkeyup
- 放開鍵盤按鍵
-
HTML Event
- 透過event.type來取得的事件名稱沒有on開頭
-
onload
- 頁面完全載入後在window物件上觸發,圖片載入完成後在其上觸發
-
onunload
- 頁面完全卸載後在window物件上觸發,圖片卸載完成後在其上觸發
-
onabort
- 放棄圖片載入
-
onblur
- 離開擁有處理權的物件
-
onchange
- 在取得處理權後,更改過文字方塊的內容,離開文字方塊時觸發
-
onerror
- 腳本出錯時在window物件上觸發,圖片無法載入時在其上觸發
-
onfocus
- 指定物件擁有處理權
-
onreset
- 重設表單
-
onselect
- 選擇網頁內容
-
onsubmit
- 送出表單
-
事件監聽
- 頁面中的事件都需要一個函數來回應,這類函數通常稱為「事件處理函數(event handler)」,
另一方面,這些函數都在即時監聽著是否有事件發生,所以也稱「事件監聽函數(event listener)
-
將事件當成HTML標籤屬性
- <input type="button" value="訊息" onclick="showInfo()" />
-
將事件當成Javascript的屬性
- document.form1.mybutton.onclick = "showInfo";
- 除了要傳遞參數,否則處理函數不用()符號。
-
事件是由Window或document等上層物件所觸發,只需設定物件的事件屬性
- document.onclick = "showInfo";
-
考慮結構與行為分離
-
匿名函數
- window.onload=function(){
var getP=document.getElementById("myP");
getP.onclick=function(){
alert("click");
}
}
-
IE事件監聽
-
在IE中,每個元素都有兩個方法來處理事件的監聽
-
[Object].attachEvent("event handler",fnHandler);
- 新增監聽函數
-
[Object].detachEvent("event handler",fnHandler);
- 刪除監聽函數
- event handler為事件的名稱,如onclick,onload…;
fnHandler為監聽函數名稱,這個函數不需加上括弧的執行結果
-
getP.attachEvent("onclick",fnClick1);
getP.attachEvent("onclick",fnClick2);
- 在IE7/8中,兩個函數的呼叫順序是fnClick2-->fnClick1,但兩者都會被執行。
例如,我們在fnClick2最後加上detachEvent來解除fnClick1,但fnClick1還是會被執行;
但如果Click第二次,因為fnClick1已經被detachEvent解除,所以只會執行fnClick2。
- IE不會執行標準DOM的addEventListener/removeEventListener方法
-
標準DOM事件監聽
-
[Object].addEventListener("event name",fnHandler, bCapture);
- 新增監聽函數
-
[Object].removeEventListener("event name",fnHandler, bCapture);
- 刪除監聽函數
- event name是click、mousemove…沒有on(注意,和IE不一樣),bCapture:false為冒泡
-
getP.addEventListener("click",fnClick1,false);
getP.addEventListener("click",fnClick2,false);
- DOM的執行順序為fnClick1-->fnClick2,而且是fnClick1執行完成後才會從行fnClick2。
所以如果我們在fnClick1中最後加上removeEventListener來解除fnClick2,那fnClick2就不會執行。
-
事件物件
- 在瀏覽器中的事件都是以「物件」的型式存在,但IE與標準DOM瀏覽器之間在取事件物件上有差別。
-
IE
-
事件物件是window物件的一個屬性event
- getP.onclick = function(){
//取得事件物件
var evt = window.event;
}
-
DOM瀏覽器
-
事件物件須使用唯一參數傳給事件管理函數
- getP.onclick = function(evt){
}
-
相容性新增事件監聽
- function (evt) {
//透過測試window.event來判斷是否是IE來決定事件物件的建立
if (window.event) evt = window.event;
...
}
-
取消事件
- 事件 --> 自訂事件處理 --> Browser預設事件處理
-
取消事件處理函數,只需設成null
- document.onclick = null;
- document.form1.mybutton.onclick = null;
-
在自訂事件處理函數取消事件
- return false;
- 只需傳回false即可
-
氣泡事件(Bubble Event)
-
<body>
-
<form>
- <input type="text" />
- <input type="radio" />
- <input type="button" />
- 上面的架構圖,每一個tag都擁有onclick事件,如果在最下層的按鈕button觸發了onclick事件,
事件不只在此tag觸發,還會向上傳遞,接著form觸發onclick事件,再來是body也一樣會觸發onclick事件。
-
事件屬性和方法
-
事件屬性和方法
-
altKey
- altKey
- Boolean
- R/W
- 按下Alt鍵則為true
-
butoon
- button
- Integer
- R/W
- 滑鼠事件,值對應按下的滑鼠鍵
-
cancelBubble
- cancelBubble
- Boolean
- IE:R/W,DOM:R
- IE設置為true可取消氣泡事件
-
--
- stopPropagation()
- Function
- N/A
- DOM使用此方法來取消氣泡事件
-
clientX
- clientX
- Integer
- IE:R/W,DOM:R
- 滑鼠指標在「用戶端區域」的X座標
-
clientY
- clientY
- Integer
- IE:R/W,DOM:R
- 滑鼠指標在「用戶端區域」的Y座標
-
ctrlKey
- ctrlKey
- Boolean
- IE:R/W,DOM:R
- 按下Ctrl鍵則為true
-
fromElement
- relatedTarget
- Element
- IE:R/W,DOM:R
- 滑鼠指標所離開的元素
-
toElement
- currentTarget
- Element
- IE:R/W,DOM:R
- 滑鼠指標正在進入的元素
-
--
- charCode
- Integer
- R
- 按下按鍵的Unicode值
-
keyCode
- keyCode
- Integer
- R/W
- IE中keypress事件按下按鍵的Unicode值,
keydown/keyup事件為按鍵的數位代號。
DOM中keypress時為0,其餘為按下按鍵的數位代號。
-
--
- detail
- Integer
- R
- 滑鼠按鍵被按一下的次數
-
returnValue
- --
- Boolean
- R/W
- 設置為false時可取消事件的預設行為
-
--
- preventDefault()
- Function
- N/A
- DOM使用該方法來阻止事件的預設行為
-
screenX
- screenX
- Integer
- IE:R/W,DOM:R
- 滑鼠指標相對於「整個電腦螢幕」的X座標值
-
screenY
- screenY
- Integer
- IE:R/W,DOM:R
- 滑鼠指標相對於「整個電腦螢幕」的Y座標值
-
shiftKey
- shiftKey
- Boolean
- IE:R/W,DOM:R
- 按下Shift鍵則為true
-
srcElement
- target
- Element
- IE:R/W,DOM:R
- 引起事件的元素/物件
-
type
- type
- String
- IE:R/W,DOM:R
- 事件的名稱
-
使用同一個函數處理多個事件
- window.onload=function(){
var objImg = document.getElementByTagName("img")[0];
objImg=handle;
objImg=handle;
}
funcion handle(evt){
if (window.event) evt = window.event; //相容性處理
if (evt.type == "click")
......
else if (evt.type == "mouseover")
......
}
-
找出觸發事件的物件
- function handle(evt){
if(window.event) evt = window.event;
var getTarget;
if(evt.srcElement) //處理相容性,獲取IE事件目標
getTarget = evt.srcElement;
else
getTarget = evt.target; //獲取DOM事件目標
......
}
-
botton的值
-
button
-
0
- 未按下按鍵
- 左鍵
-
1
- 左鍵
- 中鍵(滑輪)
-
2
- 右鍵
- 右鍵
-
3
- 同時按下左右鍵
- 不支援,undefined
-
4
- 中鍵(滑輪)
- 不支援,undefined
-
5
- 同時按下左中鍵
- 不支援,undefined
-
6
- 同時按下右中鍵
- 不支援,undefined
-
7
- 同時按下左中右鍵
- 不支援,undefined
- 3,不太可能出現,因為我們只有很小的機會能做分秘不差同時按下兩個按鍵
-
鍵盤事件
-
鍵盤重要的是:使用者按了什麼鍵?
- IE沒有charCode屬性,
而keyCode只有在keydown與keyup事件觸發時才會與標準DOM的keyCode相同,
在keypress事件中等於charCode
-
if (window.event) {
evt = window.event;
evt.charCode=(evt.type == "keypress") ? evt.keyCode : 0;
...
}
- 通常不採用keyCode是因為它表示鍵盤按鍵,而不是輸出字元,
例如輸出"a"和"A"時,keyCode的值是相等的,charCode則以字元為區分,
另外,在keypress事件中,DOM的keyCode值始終為0
-
參考資料
- IE在事件上有許多特立獨有的屬性,因相容性不佳,不建議使用,細部IE與其他Browser在Event的差異,請參考Link
- w3schools參考資料(en)
- w3school參考資料(簡)