1. 程式人生 > >淺談js中事件preventDefault()和addEventListener()

淺談js中事件preventDefault()和addEventListener()

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在操作而我們並不知道監聽到的事件到底是什麼!