5

我从互联网上加载图像:

img.src = 'some_path'

我注意到如果网络很慢,有些图像需要很长时间才能加载,而有些图像需要很长时间才能加载然后失败。

有时,域一起关闭。如果服务器关闭,这很好用,因为会很快抛出错误,我可以捕获错误并src相应地进行更改。

但是,对于速度较慢然后失败的页面 - 我看到浏览器在最终出错之前显示某种空白框似乎 10 秒或更长时间。

好像太长了 我会说给网站大约 4 秒钟,然后如果它没有响应则抛出错误。

有没有办法调整这个?

客户端在抛出错误之前等待的时间量?

让这种空白 blox 盯着用户 10 秒或更长时间看起来很草率。

目前在火狐。

4

3 回答 3

4

我知道为在脚本中获取内容设置超时的唯一方法是使用XMLHttpRequest,因此您可以通过 ajax 加载图像,例如;

function getImage(src, callback, maxTime) {
    var x = new XMLHttpRequest();
    if (maxTime) x.timeout = maxTime;
    x.onload = function () {
        var img = new Image();
        img.src = window.URL.createObjectURL(this.response);
        callback(img);
    };
    x.onerror = function () {
        callback(null);
    };
    x.open('GET', src, true);
    x.responseType = 'blob'; // save having to re-create blob
    x.send(null);
}
getImage(
    'some_path',     // get image at "some_path"
    function (img) { // then
        if (!img) alert('failed!');          // whatever if didnt work
        else document.body.appendChild(img); // whatever if did work
    },
    4000             // maximum wait is 4 seconds
);

这种方法的缺点是浏览器向后兼容,如果服务器返回一些东西但它不是图像

于 2013-08-02T18:02:40.813 回答
2

交叉/向后兼容

function loadImage(src, complete, timeout) {
    var img = document.createElement("img");
    img.src = src;
    setTimeout(function() {
        complete(img.complete && img.naturalWidth !== 0 ? img : false);
    }, timeout || 5000);
}

loadImage("path/to/image.png", function(img) {
    if(img) {
        //TODO ON SUCCESS
    } else {
        //TODO ON FAILURE
    }
}, 4000);
于 2013-08-02T18:14:55.330 回答
2

尝试这个:

var img = document.getElementById("myImg")
img.src = 'https://atmire.com/dspace-labs3/bitstream/handle/123456789/7618/earth-map-huge.jpg?sequence=1'; //very big image, takes like 7 seconds to  load
window.setTimeout(function()
{
    if(!IsImageOk(img))
        img.src = "http://www.google.com/images/srpr/logo4w.png";
},4000);

function IsImageOk(img) {
    // During the onload event, IE correctly identifies any images that
    // weren’t downloaded as not complete. Others should too. Gecko-based
    // browsers act like NS4 in that they report this incorrectly.
    if (!img.complete) {
        return false;
    }

    // However, they do have two very useful properties: naturalWidth and
    // naturalHeight. These give the true size of the image. If it failed
    // to load, either of these should be zero.

    if (typeof img.naturalWidth != "undefined" && img.naturalWidth == 0) {
        return false;
    }

    // No other way of checking: assume it’s ok.
    return true;
}

jsFiddle:http: //jsfiddle.net/hescano/mLhdv/

使用来自检查图像是否在 JavaScript 中加载(无错误)的代码

请注意,代码第一次运行良好,但之后图像将被缓存并且加载速度可能会更快。

于 2013-08-02T18:05:21.847 回答