I have a page with a lot of images that are generated server-side depending on user actions. And when image loads successfully I'm happy, but when there is an error on the server I have to act according to what an error occurred.
For example:
- 500 code: do this stuff.
- 503 code: do that stuff
and so on.
So, my question: is there any way to get status code within "img" tag on-error event handler?
No, there is no way to get the HTTP status from a request made by an img
tag in JavaScript.
You could write a firefox plugin, chrome/safari extension to do that.
An alternative would be using AJAX to load your images (not using img
tags). You can get Http Status Codes from Ajax Requests.
You cannot check HTTP status this way. However you can check if image was loaded or not using naturalWidth property.
if (img.naturalWidth === 0) {
// do sth
}
Hope it help.
You may combine the couple technics to get img.status:
<img src="/no.img" onerror="error(this)">
function error(img) {
var r = makeXMLHttpRequestAgain(img.src);
if (r.status === 500) img.src = '/e500.img';
if (r.status === 503) img.src = '/e503.img';
}
function loadBinaryImageAndInsertToImgTag(imgElement, imageUrl) {
let xhr = getXMLHttpRequest();
xhr.onreadystatechange = ProcessResponse;
xhr.open("GET", imageUrl, true);
xhr.overrideMimeType('text/plain; charset=x-user-defined');
xhr.send(null);
function getXMLHttpRequest() {
let xhr = null;
if (window.XMLHttpRequest || window.ActiveXObject) {
if (window.ActiveXObject) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
} else {
xhr = new XMLHttpRequest();
}
} else {
alert("Your browser does not support XMLHTTP");
return null;
}
return xhr;
}
function ProcessResponse() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
imgElement.src = "data:image/jpeg;base64," + encode64(xhr.responseText);
imgElement.style.display = "";
} else {
alert("Error retrieving data!");
}
}
}
function encode64(inputStr) {
let b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
let outputStr = "";
let i = 0;
while (i < inputStr.length) {
let byte1 = inputStr.charCodeAt(i++) & 0xff;
let byte2 = inputStr.charCodeAt(i++) & 0xff;
let byte3 = inputStr.charCodeAt(i++) & 0xff;
let enc1 = byte1 >> 2;
let enc2 = ((byte1 & 3) << 4) | (byte2 >> 4);
let enc3, enc4;
if (isNaN(byte2)) {
enc3 = enc4 = 64;
}
else {
enc3 = ((byte2 & 15) << 2) | (byte3 >> 6);
if (isNaN(byte3)) {
enc4 = 64;
}
else {
enc4 = byte3 & 63;
}
}
outputStr += b64.charAt(enc1) + b64.charAt(enc2) + b64.charAt(enc3) + b64.charAt(enc4);
}
return outputStr;
}
}
You have to add an eventListener on images :
For example with jQuery :
$('#your_image')
.error(function(e) {
//add your unhappy code here
//unbind if needed
$(this).unbind('error');
})
.load(function(e) {
//add your happy code here
//unbind if needed
$(this).unbind('load');
})
;