JS中的DOM操作(四)
目錄
Tips
1. 繫結事件的區別
- addEventListener();
- attachEvent()
- 相同點: 都可以為元素繫結事件
- 不同點: 1.方法名不一樣
2.引數個數不一樣addEventListener三個引數,attachEvent兩個引數
3.addEventListener 谷歌,火狐,IE11支援,IE8不支援
attachEvent 谷歌火狐不支援,IE11不支援,IE8支援
4.this不同,addEventListener 中的this是當前繫結事件的物件
attachEvent中的this是window
5.addEventListener中事件的型別(事件的名字)沒有on
attachEvent中的事件的型別(事件的名字)有on
2.為元素解綁事件
解綁事件:
注意:用什麼方式繫結事件,就應該用對應的方式解綁事件
1.解綁事件
物件.on事件名字=事件處理函式--->繫結事件
物件.on事件名字=null;
my$("btn").onclick=function () {
console.log("我猥瑣");
};
my$("btn2").onclick=function () {
//1.解綁事件
my$("btn").onclick=null;
};
2.解綁事件
物件.addEventListener("沒有on的事件型別",命名函式,false);---繫結事件
物件.removeEventListener("沒有on的事件型別",函式名字,false);
function f1() { console.log("第一個"); } function f2() { console.log("第二個"); } my$("btn").addEventListener("click",f1,false); my$("btn").addEventListener("click",f2,false); //點選第二個按鈕把第一個按鈕的第一個點選事件解綁 my$("btn2").onclick=function () { //解綁事件的時候,需要在繫結事件的時候,使用命名函式 my$("btn").removeEventListener("click",f1,false); };
3.解綁事件
物件.attachEvent("on事件型別",命名函式);---繫結事件
物件.detachEvent("on事件型別",函式名字);
function f1() {
console.log("第一個");
}
function f2() {
console.log("第二個");
}
my$("btn").attachEvent("onclick",f1);
my$("btn").attachEvent("onclick",f2);
my$("btn2").onclick=function () {
my$("btn").detachEvent("onclick",f1);
};
3.事件冒泡
事件冒泡:多個元素巢狀,有層次關係,這些元素都註冊了相同的事件,如果裡面的元素的事件觸發了,外面的元素的該事件自動的觸發了.
事件有三個階段:
1.事件捕獲階段 :從外向內
2.事件目標階段 :最開始選擇的那個
3.事件冒泡階段 : 從裡向外
為元素繫結事件:
addEventListener("沒有on的事件型別",事件處理函式,控制事件階段的)
事件觸發的過程中,可能會出現事件冒泡的效果,為了阻止事件冒泡--->
window.event.cancelBubble=true;谷歌,IE8支援,火狐不支援
window.event就是一個物件,是IE中的標準
e.stopPropagation();阻止事件冒泡---->谷歌和火狐支援
window.event和e都是事件引數物件,一個是IE的標準,一個是火狐的標準
事件引數e在IE8的瀏覽器中是不存在,此時用window.event來代替
addEventListener中第三個引數是控制事件階段的
事件的階段有三個:
通過e.eventPhase這個屬性可以知道當前的事件是什麼階段的
如果這個屬性的值是:
1---->捕獲階段
2---->目標階段
3---->冒泡
一般預設都是冒泡階段,很少用捕獲階段
冒泡階段:從裡向外
捕獲階段:從外向內
程式碼
1.為元素繫結事件和解綁事件的相容程式碼
<script>
//繫結事件的相容
function addEventListener(element,type,fn) {
if(element.addEventListener){
element.addEventListener(type,fn,false);
}else if(element.attachEvent){
element.attachEvent("on"+type,fn);
}else{
element["on"+type]=fn;
}
}
//解綁事件的相容
//為任意的一個元素,解綁對應的事件
function removeEventListener(element,type,fnName) {
if(element.removeEventListener){
element.removeEventListener(type,fnName,false);
}else if(element.detachEvent){
element.detachEvent("on"+type,fnName);
}else{
element["on"+type]=null;
}
}
//測試程式碼
function f1() {
console.log("第一個");
}
function f2() {
console.log("第二個");
}
addEventListener(my$("btn1"),"click",f1);
addEventListener(my$("btn1"),"click",f2);
my$("btn2").onclick=function () {
removeEventListener(my$("btn1"),"click",f1);
};
</script>
2.為同一個元素繫結多個不同的事件,指向相同的事件處理函式
<script>
//為同一個元素繫結多個不同的事件,指向相同的事件處理函式
my$("btn").onclick = f1;
my$("btn").onmouseover = f1;
my$("btn").onmouseout = f1;
function f1(e) {
switch (e.type) {
case "click":
alert("好帥哦");
break;
case "mouseover":
this.style.backgroundColor = "red";
break;
case "mouseout":
this.style.backgroundColor = "green";
break;
}
}
// my$("btn").onmouseover=function (e) {
// console.log(e);
// };
</script>