addEventListener和attachEvent二者綁定的執(zhí)行函數(shù)中的this不相同
更新時(shí)間:2012年12月09日 17:32:23 作者:
寫 addEventListener 和 attachEvent 區(qū)別的博文不少,不過(guò)大部分都把重點(diǎn)放置于前者是Firefox chrome,后者只是存在于IE系列中
寫 addEventListener 和 attachEvent 區(qū)別的博文不少,不過(guò)大部分都把重點(diǎn)放置于前者是Firefox chrome,后者只是存在于IE系列中。
最近在寫一個(gè)事件代理的時(shí)候,遇到一個(gè)BUG,發(fā)現(xiàn)除此外,二者綁定的執(zhí)行函數(shù)中的 this 是不相同的,addEventListener 和 attachEvent函數(shù)在運(yùn)行時(shí)候的上下文是不相同的。
用了一個(gè)簡(jiǎn)單的demo來(lái)描述這個(gè)不同點(diǎn):
<html xmlns="http://www.w3.org/1999/xhtml">
<<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<<title>測(cè)試</title>
</head>
<<body>
<div id="div1">
<a href="#" id="a1">test1</a>
</div>
<<div id="div2">
<a href="#" id="a2">test2</a>
</div>
</body>
<<script type="text/javascript">
var testGolb = "diff"; // 定義一個(gè)全局變量
var a1 = document.getElementById( "a1");
var a2 = document.getElementById( "a2");
function getEleId ( e) {
// body...
alert( this.id);
alert( this.testGolb);
}
a1.onclick = getEleId;
if( a2.attachEvent){
a2.attachEvent( "onclick", getEleId);
}else{
a2.addEventListener( 'click',getEleId);
}
</script>
</html>
點(diǎn)擊 test1
chrome 下 第一次alert:" a1",第二次alert :"undefined"
firefox 下 第一次alert:" a1",第二次alert :"undefined"
IE 中 第一次alert:" a1",第二次alert :"undefined"
這很好理解,這時(shí)候的this指向 #a1 這個(gè)DOM,所以alert id是 #a1的id “a1”,然后在this中,并沒有testGolb這個(gè)變量,所以是undefined
點(diǎn)擊 test2
chrome下 第一次alert:" a1",第二次alert :"undefined"
firefox 下 第一次alert:" a1",第二次alert :"undefined"
IE 中 第一次alert:" undefined",第二次alert :"diff"
chrome 和 firefox同點(diǎn)擊test1時(shí)候的表現(xiàn)是一致的,而IE就不同了。使用attachEvent綁定事件時(shí)候,函數(shù)中的this指向的是window,并不是添加事件的dom,所以第一次的alert 值是 undefined,而this.testGlob 的值是diff。
最近在寫一個(gè)事件代理的時(shí)候,遇到一個(gè)BUG,發(fā)現(xiàn)除此外,二者綁定的執(zhí)行函數(shù)中的 this 是不相同的,addEventListener 和 attachEvent函數(shù)在運(yùn)行時(shí)候的上下文是不相同的。
用了一個(gè)簡(jiǎn)單的demo來(lái)描述這個(gè)不同點(diǎn):
復(fù)制代碼 代碼如下:
<html xmlns="http://www.w3.org/1999/xhtml">
<<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<<title>測(cè)試</title>
</head>
<<body>
<div id="div1">
<a href="#" id="a1">test1</a>
</div>
<<div id="div2">
<a href="#" id="a2">test2</a>
</div>
</body>
<<script type="text/javascript">
var testGolb = "diff"; // 定義一個(gè)全局變量
var a1 = document.getElementById( "a1");
var a2 = document.getElementById( "a2");
function getEleId ( e) {
// body...
alert( this.id);
alert( this.testGolb);
}
a1.onclick = getEleId;
if( a2.attachEvent){
a2.attachEvent( "onclick", getEleId);
}else{
a2.addEventListener( 'click',getEleId);
}
</script>
</html>
點(diǎn)擊 test1
chrome 下 第一次alert:" a1",第二次alert :"undefined"
firefox 下 第一次alert:" a1",第二次alert :"undefined"
IE 中 第一次alert:" a1",第二次alert :"undefined"
這很好理解,這時(shí)候的this指向 #a1 這個(gè)DOM,所以alert id是 #a1的id “a1”,然后在this中,并沒有testGolb這個(gè)變量,所以是undefined
點(diǎn)擊 test2
chrome下 第一次alert:" a1",第二次alert :"undefined"
firefox 下 第一次alert:" a1",第二次alert :"undefined"
IE 中 第一次alert:" undefined",第二次alert :"diff"
chrome 和 firefox同點(diǎn)擊test1時(shí)候的表現(xiàn)是一致的,而IE就不同了。使用attachEvent綁定事件時(shí)候,函數(shù)中的this指向的是window,并不是添加事件的dom,所以第一次的alert 值是 undefined,而this.testGlob 的值是diff。
相關(guān)文章
JavaScript 入門·JavaScript 具有全范圍的運(yùn)算符
JavaScript 入門·JavaScript 具有全范圍的運(yùn)算符...2007-10-10
FF(火狐)瀏覽器無(wú)法執(zhí)行window.close()解決方案
這篇文章主要介紹了FF(火狐)瀏覽器無(wú)法執(zhí)行window.close()解決方案,需要的朋友可以參考下2014-11-11
關(guān)于JavaScript的URL.createObjectURL()的使用方法
這篇文章主要介紹了關(guān)于URL.createObjectURL()的使用方法,使用createObjectURL可以節(jié)省性能并更快速,只不過(guò)需要在不使用的情況下手動(dòng)釋放內(nèi)存,還不清楚的朋友一起來(lái)看看吧2023-04-04
javascript操作html控件實(shí)例(javascript添加html)
幾乎HTML所有標(biāo)記都可以說(shuō)是HTML的控件,如select, input, div, table等。html標(biāo)簽便捷的操作,深受大家的喜歡。如何使用javascript來(lái)操作HTML控件,下面我介紹下比較麻煩的幾個(gè)控件2013-12-12

