我刚接触JavaScript,因此对变量作用域感到困惑... 我正在尝试加载一个图像,并在它不存在时替换为另一个URL。 我必须使用纯JavaScript来完成。
这里我有2个极其相似的版本,但它们执行方式不同。唯一相同的是:它们都不起作用。第三个版本需要刷新并且在IE下无法工作。d是带有数字属性的对象,它没有问题。
以下是它们共同的部分:
.attr("xlink:href", function (d) {
var img = new Image();
这是第一版:
onload
和onerror
都被调用。然而,d接收到的是src,不幸的是它总是generic.jpg。 function onLoadHandler() {
d.src = "http://.../peopleimages/" + d.num + ".jpg";
alert(d.name + " onload called");
}
function onErrorHandler() {
d.src = "http://.../images/generic.jpg";
alert(d.name + " onerror called");
}
img.onload = onLoadHandler();
img.onerror = onErrorHandler();
img.src = "http://.../peopleimages/" + d.num + ".jpg";
return d.src;
}
这里是第二个版本:根据图片是否存在,将调用onload或onerror。但是当警告时,d.src的值未定义。
img.onload = function () {
alert(d.name + " : loaded");
d.src = "http://.../peopleimages/" + d.num + ".jpg";
}
img.onerror = function () {
alert(d.name + " : failed");
d.src = "http://.../images/generic.jpg";
}
img.src = "http://.../peopleimages/" + d.num + ".jpg";
alert(d.src);//undefined
return d.src;
}
这里是第三个版本:它可以工作,但第一次使用时无效。我必须刷新页面才能正确获取图像。可能是因为在图像完全加载之前返回了。
img.src = "http://.../peopleimages/" + d.num + ".jpg";
return img.complete ? "http://.../peopleimages/" + d.num + ".jpg" : "http://.../images/generic.jpg";
}
this
? - epascarello