私はJavaScriptを初めて使用するため、可変スコープについて混乱しています...画像をロードし、画像が存在しない場合は別のURLに置き換えようとしています。私は純粋なJavaScriptでそれをしなければなりません。
ここでは、2つのバージョンが非常に似ていますが、パフォーマンスが異なります。唯一の共通点は、機能しないということです。3番目のバージョンは更新が必要であり、IEでは機能しません。dはnumber属性のオブジェクトであり、問題はありません。
これが彼らの共通点です
.attr("xlink:href", function (d) {
var img = new Image();
ここでバージョン1:両方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;
}
ここでバージョン2:イメージの存在に応じて、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;
}
ここでバージョン3:動作しますが、初めてではありません。画像を正しく取得するには、更新を行う必要があります。おそらく、画像が完全に読み込まれる前に戻ってきます。
img.src = "http://.../peopleimages/" + d.num + ".jpg";
return img.complete ? "http://.../peopleimages/" + d.num + ".jpg" : "http://.../images/generic.jpg";
}