這篇文章主要講解addEventListener和attachEvent函數中的this的指向問題,以及如何解決,若你還不是很瞭解它們的兼容性請點擊這裏,再往下看,這裏不做詳細介紹。
首先來看兩段代碼:
//這是一個使用addEventListener函數的代碼片段
obj.addEventListener('click',function(){
console.log(this);//this指向obj
},false);
//這是一個使用attachEvent函數的代碼片段
obj.attachEvent('onclick',function(){
console.log(this);//this指向window
});
一個特別讓人容易產生誤解的地方就是:誤以爲this的指向跟addEventListener函數一樣,也是指向obj,然而並不是,attachEvent函數居然指向window,從而產生在調試舊版本ie(ie8及以下)時使用this發生一些莫名奇妙的錯誤。
那該怎麼辦呢?在這裏也提供一個方法去解決這個問題:
//這是一個使用addEventListener函數的代碼片段
obj.addEventListener('click',function(e){
console.log(this);//this指向obj
console.log(e.target);//obj
},false);
//這是一個使用attachEvent函數的代碼片段
obj.attachEvent('onclick',function(e){
console.log(this);//this指向window
console.log(e.srcElement);//obj
});
e.target和e.srcElement的兼容性請自行百度。