淺談js中事件preventDefault()和addEventListener()
阿新 • • 發佈:2019-02-03
js中有許多預設事件方法,當我們觸發時就會自動執行,比如點選連結跳轉,右鍵彈出屬性選單等等。於是為了滿足我們自定義的行為,需要阻止事件預設行為,即preventDefault()方法。
preventDefault()
preventDefault()是我們最常用的方法,但今天用的時候發現並沒有效果,一直找原因啊,終於有所發現了!
以阻止連結跳轉和右鍵彈出選單等事件為例:
<body>
<a href="https://www.baidu.com">跳轉</a>
<form id="fm" name="mm" action="#fm" >
<input type="text" name="aa" value="hello" />
<input type="submit" value="提交" />
<textarea name="tct" rows="4" cols="5"></textarea>
</form>
</body>
這裡主要使用chrome、firefox和IE三種瀏覽器引擎進行相容測試,在lunascape6中測試(方便引擎切換);
在js段中寫指令碼執行程式:
<script type="text/javascript">
window.onload=function(evt){
var link = document.getElementsByTagName('a')[0];
//第一種方法:不直接使用addEventListener來使用阻止事件預設行為,採用顯示直接事件形式
// link.onclick=function(evt){
// evt.preventDefault();//成功,相容
// alert(evt.target);//http://www.baidu.com
// alert(evt.preventDefault());//undefined
// alert(typeof evt.preventDefault);//function
// evt.returnValue=false; //只有webkit引擎支援
//}
//第二種方法:上述函式中使用evt.returnValue屬性設定為false即可阻止,但目前測試只在webkit引擎下有效
// link.onclick=function(evt){
// evt.returnValue=false; //只有webkit引擎支援
//}
//第三種方法:如果要實現的自定義功能較少,可以考慮這種簡單暴力的方法但多數情況下不建議使用,因為具有必須放在最後執行且在其後的程式碼無法執行的缺陷
// link.onclick=function(){
// return false;
// }
//第四種方法:在第一點就提到使用增加事件監聽器無效的原因是什麼呢?因為通常情況下我們使用該方法會直接呼叫,因此相當於是window這個大範圍的物件在監聽,傳給其中function的event是什麼就難以明白就無法達到效果,但實際我們要監聽的只有目標物件,因此指定目標去監聽時就可以明確function肯定是由目標物件發出的,而我們又只進行了點選操作,所以event就很明顯了!
//測試了三種引擎瀏覽器,成功
var txt = document.getElementsByTagName('textarea')[0];
// txt.addEventListener('contextmenu',function(evt){
// evt.preventDefault();
// alert('Hello');
// },false);
}
</script>
以上測試在瀏覽器新版本中可行,低版本未測試過
addEventListener()
addEventListener()解決了我們在事件中傳遞this、多重遞迴導致瀏覽器崩潰和函式覆蓋等很多問題,為解決事件提供了很好的支援。
但一般使用該方法時,習慣直接使用不指定物件,這可能會產生意外效果需要注意。另外使用物件顯示呼叫addEventListener時要注意引數有所不同,(type,listener,scope)分別是:事件型別,監聽到事件執行的function,以及捕捉(true)或冒泡(false)的boolean值設定。
因此,總結下用到addEventListener()時需要謹慎一些,最好採用指定物件監聽方式,因為預設情況下直接使用是window在操作而我們並不知道監聽到的事件到底是什麼!