简体   繁体   English

如何获取HTTP的状态码 <img> 标签

[英]How to get HTTP status code of <img> tags

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. 500代码:做这个东西。
  • 503 code: do that stuff 503代码:做那些东西

and so on. 等等。

So, my question : is there any way to get status code within "img" tag on-error event handler? 所以,我的问题是:有没有办法在“img”标签的错误事件处理程序中获取状态代码?

No, there is no way to get the HTTP status from a request made by an img tag in JavaScript. 不,没有办法从JavaScript中的img标记发出的请求中获取HTTP状态。

You could write a firefox plugin, chrome/safari extension to do that. 你可以写一个firefox插件,chrome / safari扩展来做到这一点。

An alternative would be using AJAX to load your images (not using img tags). 另一种方法是使用AJAX加载图像(不使用img标签)。 You can get Http Status Codes from Ajax Requests. 您可以从Ajax请求中获取Http状态代码。

You cannot check HTTP status this way. 您无法以这种方式检查HTTP状态。 However you can check if image was loaded or not using naturalWidth property. 但是,您可以使用naturalWidth属性检查图像是否已加载。

if (img.naturalWidth === 0) {
    // do sth
}

Hope it help. 希望它有所帮助。

You may combine the couple technics to get img.status: 你可以结合使用这些技术来获得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 : 您必须在图像上添加eventListener:

For example with jQuery : 例如使用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');
    })
    ;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM