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

Javascript 如何获取<;的HTTP状态代码;img>;标签,javascript,image,http-status-codes,Javascript,Image,Http Status Codes,我有一个包含大量图像的页面,这些图像是根据用户操作在服务器端生成的。当图像加载成功时,我很高兴,但当服务器上出现错误时,我必须根据发生的错误采取行动 例如: 500代码:做这件事 代码503:做那些事 等等 那么,我的问题是:有没有办法在错误事件处理程序的“img”标记中获取状态代码 否,无法从JavaScript中的img标记发出的请求中获取HTTP状态 你可以编写一个firefox插件,chrome/safari扩展来实现这一点 另一种方法是使用AJAX加载图像(不使用img标记)。您可

我有一个包含大量图像的页面,这些图像是根据用户操作在服务器端生成的。当图像加载成功时,我很高兴,但当服务器上出现错误时,我必须根据发生的错误采取行动

例如:

  • 500代码:做这件事
  • 代码503:做那些事
等等


那么,我的问题是:有没有办法在错误事件处理程序的“img”标记中获取状态代码

否,无法从JavaScript中的
img
标记发出的请求中获取HTTP状态

你可以编写一个firefox插件,chrome/safari扩展来实现这一点


另一种方法是使用AJAX加载图像(不使用
img
标记)。您可以从Ajax请求中获取Http状态代码。

您必须在图像上添加eventListener:

例如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');
    })
    ;

您不能用这种方式检查HTTP状态。不过,您可以使用naturalWidth属性检查图像是否已加载

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

希望对您有所帮助。

您可以结合这两种技术获得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';
}

功能错误(img){
var r=makeXMLHttpRequestAgain(img.src);
如果(r.status==500)img.src='/e500.img';
如果(r.status==503)img.src='/e503.img';
}
函数loadBinaryImageAndInsertToImgTag(imgElement,imageUrl){
设xhr=getXMLHttpRequest();
xhr.onreadystatechange=ProcessResponse;
xhr.open(“GET”,imageUrl,true);
xhr.overrideMimeType('text/plain;charset=x-user-defined');
xhr.send(空);
函数getXMLHttpRequest(){
设xhr=null;
if(window.XMLHttpRequest | | window.ActiveXObject){
if(window.ActiveXObject){
试一试{
xhr=新的ActiveXObject(“Msxml2.XMLHTTP”);
}捕获(e){
xhr=新的ActiveXObject(“Microsoft.XMLHTTP”);
}
}否则{
xhr=newXMLHttpRequest();
}
}否则{
警报(“您的浏览器不支持XMLHTTP”);
返回null;
}
返回xhr;
}
函数ProcessResponse(){
if(xhr.readyState==4){
如果(xhr.status==200){
imgElement.src=“数据:图像/jpeg;base64,”+encode64(xhr.responseText);
imgElement.style.display=“”;
}否则{
警报(“检索数据时出错!”);
}
}
}
函数encode64(inputStr){
设b64=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz012456789+/=”;
让outputStr=“”;
设i=0;
while(i>2;
设enc2=((字节1和字节3)>4);
设enc3,enc4;
if(isNaN(字节2)){
enc3=enc4=64;
}
否则{
enc3=((字节2和字节15)>6);
if(isNaN(字节3)){
enc4=64;
}
否则{
enc4=字节3和字节63;
}
}
输出str+=b64.charAt(enc1)+b64.charAt(enc2)+b64.charAt(enc3)+b64.charAt(enc4);
}
返回outputStr;
}
}

请注意,从“浏览器触发错误事件之前必须附加事件处理程序,这就是示例在附加处理程序后设置src属性的原因。”(重点是我的)。只要对其抛出一些jQuery,它肯定会解决问题!你为什么要在客户身上处理这些问题?为什么不让服务器正确处理这些图像?@Raynos情况是这样的:图像是在服务器上动态创建的,但这需要很多时间,这意味着当浏览器请求时,其中一些图像无法准备好。同时,服务器端可能会出现一些严重错误,根本不会有映像。所以,基于http状态,我必须再次向服务器请求图像,或者只是通知用户错误。不,您仍然在做错误的事情。您有一个HTTP服务器,当您收到一个图像的传入get请求时,您可以“等待”它准备就绪。如果发生严重错误,您可以返回“严重错误”图像。@Raynos很遗憾,我只在前端工作,无法访问后端。我对问题的状况不满意。据我所知,服务器无法保持大量的开放连接,所以我只能询问映像是否准备好,而不是等待映像准备好。插件是不可接受的。AJAX看起来不错,但是我应该通过AJAX获得什么样的数据呢?我可以检索图像数据,但无法使用它创建img元素。您很可能需要将其作为数据url发送。您可能需要找到某种可以在服务器端生成数据URL的库。一旦它们到达,只需将img的src设置为数据url即可。这将为加载图像增加大量开销。真正的解决方案可能是修复服务器,使其始终成功地发送图像。Ajax不是一个好的替代品,以防您想要加载的图像被放置在外部域上。2016年这个问题有什么新消息吗?对于阅读此页面的任何人来说,并非所有浏览器都支持naturalWidth属性。这个属性也是非常敏感的-您应该只在图像加载后尝试读取它。我希望这会有帮助@你指的是09年的帖子。现在它在所有最新版本的浏览器中都能正常工作
 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;
        }
    }