在加载之前检查图像是否存在

时间:2015-05-01 17:27:42

标签: javascript jquery image preload image-preloader

我使用了其他各种Stack Overflow问题中的示例,但出于某种原因,这对我不起作用。我创建了一个函数来获取缩略图,并返回实际图像路径或默认(无缩略图)图像的路径。

使用JQuery方法以及Javascript Image类,我在控制台中收到404错误图像错误,找到的图像没有错误但不显示。任何人都可以指出我做错了吗?

在getThumbnail()函数中," image_url"写入控制台时显示正确。当我在调用函数中并记录返回的值时,它只显示为" undefined"。

JQuery的:

function getThumbnail(name)
{
    var image_url = "images/" + name + ".jpg";

    $.get(image_url)
        .done(function()
        {
            return image_url;
        })
        .fail(function()
        {
            return "images/default.jpg";
        })
}

使用Javascript:

function getThumbnail(name)
{
    var image = new Image();
    image.src = image_url;

    image.onload = function()
    {
        return image;
    }
    image.onerror = function()
    {
        return "images/default.jpg";
    }
}

调用功能:

            $.each( cycle, function( key, value )
            {
                var mapIndex = key;
                var mapValue = value;

                var brick = "<div class='brick small'><a class='delete' href='#'>&times;</a><img src='" + getThumbnail(value) + "' /><h2><span>" + value + "</span></h2></div>";
                $( ".gridly" ).append( brick );
            });

2 个答案:

答案 0 :(得分:14)

它不起作用的问题是getThumbnail()方法不会按你的意愿运行。

.onload是异步调用,对于这种情况,getThumbnail(value)将始终具有未定义的返回结果;

要完成您想要的任务,您可以执行以下操作:

<img src="/image/..." onerror="javascript:this.src='images/default.jpg'"/>

答案 1 :(得分:1)

这不起作用,因为return位于onerroronload函数中,并且因为请求是异步的,所以函数不会等到reuest完成。

你可以使用回调来实现这一点。

function callback(src, value){
                var brick = "<div class='brick small'><a class='delete' href='#'>&times;</a><img src='" + src + "' /><h2><span>" + value + "</span></h2></div>";
                $( ".gridly" ).append( brick );
}

function getThumbnail(name, c)
{
    var image_url = "images/" + name + ".jpg";

    var image = new Image();

    image.onload = function()
    {
        c(image_url, name);
    }
    image.onerror = function()
    {
        c("images/default.jpg", name);
    }

    image.src = image_url;
}

$.each( cycle, function( key, value )
{
    var mapIndex = key;
    var mapValue = value;

    getThumbnail(value, callback);
});