方法1:javascript
<input type="button" value="click me" onclick="alert('Clicked')"/>
方法2:css
<input type="button" value="click me" onclick="alert("Clicked")"/>
方法3:html
<input type="button" value="click me" onclick="showMessage()"/> <script type="text/javascript"> function showMessage() { alert("Clicked"); } </script>
這樣指定事件處理程序會建立一個封裝着元素屬性值的函數。該該函數中有局部變量event對象和this(等於事件目標元素)值。java
<input type="button" value="click me" onclick="alert(event.type)"/> //彈出"click" <input type="button" value="click me" onclick="alert(this.value)"/>//彈出"click me"
先略chrome
1.時差問題:用戶可能會在HTML元素一出現就在頁面觸發相應事件,但事件處理程序可能還不具有執行條件。以下改進:瀏覽器
<input type="button" value="click me" onclick="try{showMessage();}catch(ex){}"/>
3.HTML與JavaScript代碼緊密耦合。app
缺點:一個元素只能這樣添加一個事件處理程序。dom
var btn=document.getElementById("myBtn"); btn.onclick=function(){//添加事件處理程序 alert(this.id); } btn.onclick=null;//取消事件處理程序
優點:能夠添加多個事件處理程序,按順序觸發。函數
var btn=document.getElementById("myBtn"); btn.addEventListener("click",function(){ alert(this.id) },false); btn.addEventListener("click",function(){ alert("Hello world"); },false);
直接傳入相同的函數代碼沒用,其實那是個徹底不一樣的函數:學習
var btn=document.getElementById("myBtn"); btn.addEventListener("click",function(){ alert(this.id) },false); btn.removeEventListener("click",function(){ alert("this.id"); },false);//沒用
得像這樣:
var btn=document.getElementById("myBtn"); var handler=function(){ alert(this.id); } btn.addEventListener("click",handler,false); btn.removeEventListener("click",handler,false);//有效
通常第三個參數都爲false(添加到冒泡階段),這樣能夠最大限度地兼容瀏覽器。
var btn=document.getElementById("myBtn"); var handler=function(){ alert("Clicked"); }; btn.attachEvent("onclick",handler); btn.detachEvent("onclick",handler);
注意:
3.事件處理程序的做用域是全局做用域,this爲window;而DOM0、DOM2事件處理程序做用域是其元素的做用域。
var btn=document.getElementById("myBtn"); var handler=function(){ alert(this===window);//true }; btn.attachEvent("onclick",handler);
5.用detachEvent()時與DOM2方法同樣,第二個參數不能是匿名函數,只能採用相同函數的引用。
var EventUtil={ addHandler:function(element,type,handler){ if (element.addEventListener) { element.addEventListener(type,handler,false); } else if (element.attachEvent) { element.attachEvent("on"+type,handler); } else{ element["on"+type]=handler; } }, removeHandler:function(element,type,handler){ if (element.removeEventListener) { element.removeEventListener(type,handler,false); } else if (element.detachEvent) { element.detachEvent("on"+type,handler); } else{ element["on"+type]=null; } } }
應用:
var btn=document.getElementById("myBtn"); var handler=function(){ alert("Hello world"); } EventUtil.addHandler(btn,"click",handler);
缺陷:沒有考慮全部的瀏覽器問題,如IE做用域的問題。
方法/屬性名稱 | 類別 | 做用 |
---|---|---|
preventDefault() | Function | 取消事件的默認行爲。在cancelable是true的時候能夠用這個方法。 |
stopImmediatePropagation() | Function | 取消事件冒泡同時阻止當前節點上的事件處理程序被調用。 |
stopPropagation() | Function | 取消事件的進一步捕獲或冒泡,對當前節點無影響。在bubbles是true的時候能夠用這個方法。 |
target | Element | 事件真正的具體的目標 |
currentTarget | Element | 被事件處理程序註冊的元素 |
bubbles | Boolean | 事件是否能夠冒泡 |
cancelable | Boolean | 是否能夠取消事件默認行爲 |
type | String | 被觸發的事件的類型 |
eventPhase | Integer | 調用事件處理的階段:一、二、3(捕獲、目標、冒泡) |
爲目標元素綁定事件處理程序:
var btn=document.getElementById("myBtn"); btn.onclick=function(event){ console.log(this===event.target);//true console.log(this===event.currentTarget);//true console.log(this===btn);//true }
爲非目標元素綁定事件處理程序:
var btn=document.getElementById("myBtn"); document.body.onclick=function(event){ console.log(this===event.target);//false console.log(this===document.body);//true console.log(event.target===btn);//true }
var btn=document.getElementById("myBtn"); var handler=function(event){ switch (event.type) { case "click": alert("Clicked"); break; case "mouseover": event.target.style.setProperty("background-color","red"); break; case "mouseout": event.target.style.removeProperty("background-color"); break; } }; btn.onclick=handler; btn.onmouseover=handler; btn.onmouseout=handler;
例如:a元素默認行爲是點擊時導航到指定URL,這樣能夠阻止
link.onclick=function(event){ event.preventDefault(); }
當即中止事件在DOM層次的傳播。以下能夠避免觸發document.body上的事件處理程序。
var btn=document.getElementById("myBtn"); btn.onclick=function(event){ alert("clicked"); event.stopPropagation(); } document.body.onclick=function(event){ alert("Body clicked"); }
var btn=document.getElementById("myBtn"); btn.onclick=function(event){ alert(event.eventPhase); }//2 document.body.addEventListener("click",function(event){ alert(event.eventPhase); },true);//1 document.body.addEventListener("click",function(event){ alert(event.eventPhase); },false);//3
方法/屬性名稱 | 類別 | 做用 |
---|---|---|
cancelBubble | Boolean | 默認爲false,設置爲true能夠取消事件冒泡(與DOM的stopPropagation()方法做業相同) |
returnValue | Boolean | 默認爲true,設置爲false能夠取消事件的默認行爲(與DOM的preventDefault()方法做用相同) |
srcElement | Element | 事件的真正的具體的目標(與DOM的target屬性做用相同) |
var EventUtil={ addHandler:function(element,type,handler){ if (element.addEventListener) { element.addEventListener(type,handler,false); } else if (element.attachEvent) { element.attachEvent("on"+type,handler); } else{ element["on"+type]=handler; } }, removeHandler:function(element,type,handler){ if (element.removeEventListener) { element.removeEventListener(type,handler,false); } else if (element.detachEvent) { element.detachEvent("on"+type,handler); } else{ element["on"+type]=null; } }, getEvent:function(event){ return event?event:window.event; }, preventDefault:function(event){ if (event.preventDefault) { event.preventDefault(); } else{ event.returnValue=false; } }, getTarget:function(event){ return event.target?event.target:event.srcElement; }, stopPropagation:function(event){ if (event.stopPropagation) { event.stopPropagation(); } else{ event.cancelBubble=true; } } };
EventUtil對象使用例子:
var link=document.getElementById("mylink"); EventUtil.addHandler(link,"click",function(event){ event=EventUtil.getEvent(event); EventUtil.preventDefault(event); target=EventUtil.getTarget(event); alert(target.tagName); });
不必定與用戶操做有關的事件。
當頁面徹底加載後(包括全部圖像、JavaScript文件、CSS文件等外部資源),就會觸發window上面的load事件。
此時爲該事件處理程序傳入的event對象不包含有關這個事件的任何附加信息。只有在兼容DOM的瀏覽器中,event.target屬性被設置爲document。
方法一:
EventUtil.addHandler(window,"load",function(event){ alert("loaded"); })
方法二:
<body onload="alert('loaded')">//只能爲body添加onload屬性,不能如方法一那樣爲body綁定load事件 ··· <\body>
EventUtil.addHandler(window,"load",function(){ var image=document.createElement("img"); EventUtil.addHandler(image,"load",function(event){ event=EventUtil.getEvent(event); var target=EventUtil.getTarget(event); alert(target.src); }); document.body.appendChild(image); image.src="news.png"; })
注意:
EventUtil.addHandler(window,"load",function(){//該處括號內寫上event也沒事 var script=document.createElement("script"); EventUtil.addHandler(script,"load",function(event){ alert("loaded"); }); script.src="test2.js"; document.body.appendChild(script); })
EventUtil.addHandler(window,"load",function(event){ var link=document.createElement("link"); link.type="text/css"; link.rel="stylesheet"; EventUtil.addHandler(link,"load",function(event){ alert("loaded"); }); link.href="test1.css"; document.getElementsByTagName("head")[0].appendChild(link); });
在文檔徹底被卸載時觸發
當瀏覽器窗口被調整到一個新的高度或寬度時觸發。IE、Safari、Chrome、Opera會在窗口變化了1像素時就觸發resize事件。Firefox在用戶中止調整窗口大小時才觸發resize。
EventUtil.addHandler(window,"resize",function(event){ alert("resized"); });
在window對象上發送,實際表示頁面中相應元素的變化。可用scrollLeft和scrollTop來監控這一變化。
EventUtil.addHandler(window,"scroll",function(event){ if (document.compatMode=="CSS1Compat") {//標準模式用document.documentElement alert(document.documentElement.scrollTop); } else{//"backMode"混雜模式用document.body alert(document.body.scrollTop); } });
在元素失去焦點時觸發。不冒泡。
在元素得到焦點時觸發。不冒泡。
在元素得到焦點時觸發。與focus等價,但它冒泡。
在元素失去焦點時觸發。是blur的通用版,但它冒泡。
注意:
focusin/focusout支持瀏覽器是IE5.5+、Safari5.1+、Opera11.5+和Chrome;另有相同做用的DOMFocusIn/DOMFocusOut,只有Opera支持。
事件名稱 | 簡介 |
---|---|
click | 單擊鼠標左鍵或按下回車觸發 |
dbclick | 雙擊鼠標左鍵觸發 |
mousedown | 用戶按下任意鼠標按鈕時觸發 |
mouseup | 用戶釋放鼠標按鈕時觸發 |
mouseover | 用戶首次將鼠標從一個元素移入另外一個元素邊界以內時觸發 |
mouseout | 用戶將鼠標從一個元素移入另外一個元素時觸發,另外一個元素可能位於前一個元素的內部或外部、子元素 |
mouseenter | 在鼠標光標從元素外部首次移動到元素範圍以內(包括其子元素)時觸發。不冒泡。 |
mouseleave | 在位於元素上方的鼠標光標移動到元素範圍以外時觸發(移到後代元素上不觸發)。不冒泡。 |
表示事件發生時,鼠標光標在視口中的水平和垂直座標。注意:其不包括頁面滾動距離。
EventUtil.addHandler(document.body,"click",function(event){ event=EventUtil.getEvent(event); alert("clientX:"+event.clientX+" clientY:"+event.clientY); })
表示事件發生時,鼠標光標在頁面中的位置。注意:其實從頁面自己計算座標而非視口。
EventUtil.addHandler(document.body,"click",function(event){ event=EventUtil.getEvent(event); alert("pageX:"+event.pageX+" pageY:"+event.pageY); })
EventUtil.addHandler(document.body,"click",function(event){ event=EventUtil.getEvent(event); alert("screenX:"+event.screenX+" screenY:"+event.screenY); })
這些鍵經常被用來修改鼠標事件的行爲,對應四個屬性表示修改鍵的狀態:shiftKey,ctrlKey,altKey,metaKey。鍵被按下,則值爲true;不然爲false。
var btn=document.getElementById("myBtn"); EventUtil.addHandler(btn,"click",function(event){ event=EventUtil.getEvent(event); var keys=new Array(); if (event.shiftKey) { keys.push("shift"); } if (event.ctrlKey) { keys.push("ctrl"); } if (event.altKey) { keys.push("alt"); } if (event.metaKey) { keys.push("meta"); } alert("Keys:"+keys.join(",")); })
相關元素爲:event.relatedTarget屬性(DOM),event.fromElement/toElement(IE)
兼容性代碼:
var EventUtil={ ··· getRelatedTarget: function(event){ if (event.relatedTarget) { return event.relatedTarget; } else if(event.fromElement) { return event.fromElement; } else if(evnet.toElement){ return event.toElement; } else{ return null; } } }
對於mousedown和mouseup事件來講,其具備event.button屬性。
DOM的event.button可爲:
IE較複雜
可檢測器event.wheelData屬性,該屬性是120的倍數(正數表向前滾,負數表向後滾,Opera中正負號顛倒)。
EventUtil.addHandler(document,"mousewheel",function(event){ event=EventUtil.getEvent(event); alert(event.wheelData); })
與mousewheel事件相似,對應信息保存在detail屬性中,爲3的倍數(正數表向前滾,負數表向後滾)。