這裡使用一個圖片切換的方法來舉例說明,如何通過程式碼操作事件。
1 通過html屬性處理事件
<img id='avatar1' src="http://7u2gej.com1.z0.glb.clouddn.com/123.png" onmouseover="changeImg(this,event)" onmouseleave="changeImg(this,event)" width="100px" height="100px">
<script>
var myImage = [
"http://7u2gej.com1.z0.glb.clouddn.com/123.png",
"http://7u2gej.com1.z0.glb.clouddn.com/blog%28hui2%29.png"
]
function changeImg(that, e) {
if (e.type == "mouseleave") {
that.src = myImage[0]
} else {
that.src = myImage[1]
}
}
</script>
使用Event物件的target屬性代替this
<img id='avatar1' src="http://7u2gej.com1.z0.glb.clouddn.com/123.png" onmouseover="changeImg(event)"
onmouseleave="changeImg(event)" width="100px" height="100px">
<script>
var myImage = [
"http://7u2gej.com1.z0.glb.clouddn.com/123.png",
"http://7u2gej.com1.z0.glb.clouddn.com/blog%28hui2%29.png"
]
function changeImg(e) {
var el = e.target
if (e.type == "mouseleave") {
el.src = myImage[0]
} else {
el.src = myImage[1]
}
}
</script>
缺點:
- html與js混很容易混在一起,比較難維護修改
- 不修改html就不能修改事件處理程式
- 只能為html程式碼中出現的元素簡歷事件處理程式,不能動態建立元素
2 通過物件屬性處理事件
物件屬性處理事件,可以很好的彌補上面兩種方法的缺點。
<img id='avatar' src="http://7u2gej.com1.z0.glb.clouddn.com/123.png" width="100px" height="100px">
<script>
var myImage = [
"http://7u2gej.com1.z0.glb.clouddn.com/123.png",
"http://7u2gej.com1.z0.glb.clouddn.com/blog%28hui2%29.png"
]
function changeImg(e) {
var el = e.target
if (e.type == "mouseleave") {
el.src = myImage[0]
} else {
el.src = myImage[1]
}
}
//執行事件處理程式時,瀏覽器會自動給處理函式傳遞Event物件。
document.getElementById("avatar").onmouseover = changeImg;
document.getElementById("avatar").onmouseleave= changeImg;
</script>
3 標準事件模型
3.1 標準方式
通過程式碼連線到事件的標準方式。並且實際專案中一般都使用這種方法:
<script>
var myImage = [
"http://7u2gej.com1.z0.glb.clouddn.com/123.png",
"http://7u2gej.com1.z0.glb.clouddn.com/blog%28hui2%29.png"
]
var img = document.getElementById("avatar")
function chgImgMouseover(e) {
var el = e.target
el.src = myImage[1]
}
function chgImgMouseleave(e) {
var el = e.target
el.src = myImage[0]
}
//不直接使用每個元素的onmouseover/onmouseleave物件,而是通過addEventListener()註冊mouseover/mouseleave事件處理程式
//新增一個事件監聽器用來監聽mouseover事件
img.addEventListener("mouseover", chgImgMouseover)
img.addEventListener("mouseleave", chgImgMouseleave)
</script>
img.removeEventListener("mouseover",chgImgMouseover) //刪除監聽mouseover事件的監聽器
img.removeEventListener("mouseleave", chgImgMouseleave)
標準事件模型的優點是,可以為一個元素的一個事件註冊多個事件監聽器,在需要用不同、不相關的函式監聽元素上同一個事件時,比較有用。
針對同一個所監聽的事件也可以呼叫多個函式,如下:
//這些函式是按順序執行的
img.addEventListener("click", funOne)
img.addEventListener("click", funTwo)
img.addEventListener("click", funThree)
img.addEventListener("click", funFour)
3.2 使用匿名函式
<script>
var myImage = [
"http://7u2gej.com1.z0.glb.clouddn.com/123.png",
"http://7u2gej.com1.z0.glb.clouddn.com/blog%28hui2%29.png"
]
var img = document.getElementById("avatar")
img.addEventListener("click", function (e) {
var el = e.target
el.src = myImage[1]
e.preventDefault() //取消事件的預設動作
})
</script>