您可以在HTML标记上使用this
标记进行onclick吗?
这是我的JS代码......
function changeImage() {
this/*<-- right there <--*/.src=a;
}
document.getElementsByTagName('img').onclick = function(){
changeImage();
} ;
我做错了吗?
答案 0 :(得分:2)
以这种方式使用......
function changeImage(curr) {
console.log(curr.src);
}
document.getElementsByTagName('img').onclick = function(){
changeImage(this);
} ;
答案 1 :(得分:1)
您可以使用.call()
方法调用具有this
上下文的函数。
在这种情况下,您可以使用:
changeImage.call(this)
function changeImage() {
this.src = 'http://placehold.it/200/f00';
}
document.getElementsByTagName('img')[0].onclick = function(){
changeImage.call(this);
};
作为旁注,getElementsByTagName
会返回实时HTMLCollection个元素。您需要将onclick
处理程序应用于该集合中的元素。
如果要将事件侦听器应用于元素集合,则迭代它们并添加如下事件侦听器:
function changeImage() {
this.src = 'http://placehold.it/200/f00';
}
Array.prototype.forEach.call(document.getElementsByTagName('img'), function(el, i) {
el.addEventListener('click', changeImage);
});
或者你可以简化它:
Array.prototype.forEach.call(document.getElementsByTagName('img'), function(el, i) {
el.addEventListener('click', function () {
this.src = 'http://placehold.it/200/f00';
});
});
答案 2 :(得分:0)
你做错了两件事。
changeImage
(因此,this
将为undefined
或window
,具体取决于您是处于严格模式还是现在。)固定版本如下所示:
var images = document.getElementsByTagName('img');
for (var i = 0; i < images.length; i++) {
images[i].onclick = function () {
changeImage.call(this);
};
}
但是一个更整洁的版本会跳过除了调用另一个函数之外什么也不做的匿名函数:
var images = document.getElementsByTagName('img');
for (var i = 0; i < images.length; i++) {
images[i].onclick = changeImage;
}
现代代码将使用addEventListener
。
var images = document.getElementsByTagName('img');
for (var i = 0; i < images.length; i++) {
images[i].addEventListener('click', changeImage);
}
但是,图像不是交互式控件。您不能(默认情况下)将它们集中在一起,因此这种方法会使那些没有使用指针设备的人无法访问它们。最好使用专为交互而设计的控件。
通常,这应该是一个简单的按钮。您可以使用CSS删除默认的填充/边框/背景。
如果您不能在普通HTML中添加按钮,则可以使用JS添加它。
var images = document.getElementsByTagName('img');
for (var i = 0; i < images.length; i++) {
var image = images[i];
var button = document.createElement('button');
button.type = "button";
image.parentNode.replaceChild(button, image);
button.appendChild(image);
button.addEventListener('click', changeImage);
}
function changeImage(event) {
this.firstChild.src = a;
}