<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <button>事件監聽原理探究</button> <script> var btn = document.getElementsByTagName("button")[0]; // btn.addEventListener("click",fn1); // btn.addEventListener("click",fn2); var i=0; fn("click",fn1,btn); fn("click",fn2,btn); fn("click",fn3,btn); function fn1(){ i++; console.log("我是第一個監聽"+i); } function fn2(){ i++; console.log("我是第二個監聽"+i); } function fn3(){ i++; console.log("我是第三個監聽"+i); } function fn(str,fn,ele){ //判斷位置要注意:如果進入綁定事件本身,那么該事件已經本綁定了 //所以獲取舊的事件必須在新的事件綁定之前 var oldEvent = ele["on"+str]; ele["on"+str] = function () { //不能直接執行函數,因為我們還不知道以前有沒有綁定我同樣的事件 //進行判斷,如果以前有過綁定事件,那么把以前的執行完畢在執行現在的事件,如果沒有就直接執行 //如果沒有被定義過事件該事件源的該事件屬性應該是null對應的boolean值是false //如果已經定義過事件該事件源的該事件屬性應該是function本身對應的boolean值是true if(oldEvent){ //因為oldEvent本身他就是函數本身,那么后面加一個();就是執行函數 // console.log(oldEvent()+"oldEvent"+i); oldEvent(); fn(); }else{ //沒有綁定過事件 fn(); console.log("沒有綁定事件"); } } } </script> </body> </html>