事件处理函数分为不带参数和带参数的。不带参数的函数绑定事件时不需要加小括号,而带参数的函数绑定事件时要打包在匿名函数中。
函数名后加小括号才表示函数调用。下面的代码中,showPic函数不带参数,如果打包在匿名函数中绑定点击事件时,this.getAttribute方法成了未定义,这表明this关键字指代的元素节点有问题。如果不打包在匿名函数中绑定事件,则可以用this.getAttribute方法。
为什么会出现这种情况呢?
回答:根据《JavaScript&jQuery交互式Web前端开发》P260页介绍,this关键字指向的是this所在函数的所有者。当不带参数的函数showPic没有打包在匿名函数中时,showPic函数的所有者是发生事件的元素节点。而当showPic函数打包在匿名函数中时,showPic函数的所有者是匿名函数,这时候this指向了匿名函数,当然this.getAttribute方法就会undefined。
因此,用this关键字在函数里指代发生事件的元素节点时,要注意绑定事件的函数一定不要打包在匿名函数里。如果打包在匿名函数里,可以把this作为参数传递到函数中,这时候的this指代的是发生事件的元素节点。比如定义函数function showPic(whichpic){这里是函数体代码;}
元素绑定事件处理函数,打包在匿名函数中
element.onclick = function() {
showPic(this);//这里的this指向发生click事件的元素节点element。
}
function showPic() {
if (!document.getElementById) {
return false;
}else {
var source = this.getAttribute(“href”);
var placeholder = document.getElementById(“placeholder”);
var image_description = this.childNodes[0].nodeValue;
placeholder.setAttribute(“src”,source);
document.getElementById(“image_description”).childNodes[0].nodeValue = image_description;
return false;
}
}
window.onload = function() {
var choosen = document.getElementsByTagName(“a”);
for(var i =0; i < choosen.length; i++){
choosen[i].onclick = function() {
showPic();
}
}
}