答えはいいですが、問題が1つあります。onload
またはonerror
直接割り当てると、以前に割り当てられたコールバックが置き換えられる可能性があります。MDNで言うように、「指定されたリスナーを、呼び出されたEventTargetに登録する」という素晴らしいメソッドがあるのはそのためです。同じイベントに必要な数のリスナーを登録できます。
答えを少し書き直してみましょう。
function testImage(url) {
var tester = new Image();
tester.addEventListener('load', imageFound);
tester.addEventListener('error', imageNotFound);
tester.src = url;
}
function imageFound() {
alert('That image is found and loaded');
}
function imageNotFound() {
alert('That image was not found.');
}
testImage("http://foo.com/bar.jpg");
外部リソースの読み込みプロセスは非同期であるため、次のようなPromiseを備えた最新のJavaScriptを使用するとさらに便利です。
function testImage(url) {
// Define the promise
const imgPromise = new Promise(function imgPromise(resolve, reject) {
// Create the image
const imgElement = new Image();
// When image is loaded, resolve the promise
imgElement.addEventListener('load', function imgOnLoad() {
resolve(this);
});
// When there's an error during load, reject the promise
imgElement.addEventListener('error', function imgOnError() {
reject();
})
// Assign URL
imgElement.src = url;
});
return imgPromise;
}
testImage("http://foo.com/bar.jpg").then(
function fulfilled(img) {
console.log('That image is found and loaded', img);
},
function rejected() {
console.log('That image was not found');
}
);