使用jQuery异步加载图像

Ari*_*ief 139 javascript ajax jquery image jquery-load

我想使用jQuery异步加载我的页面上的外部图像,我尝试了以下内容:

$.ajax({ 
   url: "http://somedomain.com/image.jpg", 
   timeout:5000,
   success: function() {

   },
   error: function(r,x) {

   }
});
Run Code Online (Sandbox Code Playgroud)

但它总是返回错误,甚至可以像这样加载图像?

我尝试使用.load方法并且它可以工作,但我不知道如果图像不可用我怎么能设置超时(404).我怎样才能做到这一点?

kar*_*m79 196

不需要ajax.您可以创建一个新的图像元素,设置其源属性,并在完成加载后将其放置在文档中的某个位置:

var img = $("<img />").attr('src', 'http://somedomain.com/image.jpg')
    .on('load', function() {
        if (!this.complete || typeof this.naturalWidth == "undefined" || this.naturalWidth == 0) {
            alert('broken image!');
        } else {
            $("#something").append(img);
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 如何处理超时和404? (19认同)
  • 如果您检查浏览器的时间轴,例如Google Chrome的开发工具时间轴,您会看到创建任何DOM元素(无论您是否将其附加到DOM显然都是无关紧要的),然后设置其来源将其添加到当前文档的加载中list - 所以在加载创建的元素之前,页面不会完成"加载".你的解决方案实际上并不是异步事件,因为window.load()在图像加载之前不会触发,可能会延迟某些`paint`或`layout`操作,并且肯定会延迟任何`onload`事件依赖. (7认同)
  • @TomAuger:那么我们如何让它真正异步?我刚用load()测试了代码,它不是异步的. (2认同)
  • @gidzior它在IE8中不起作用,因为你无法使用jquery在IE8中设置SRC属性.请参考此处:http://stackoverflow.com/questions/12107487/internet-explore-8-wont-change-image-src-with-attr (2认同)

msc*_*ock 76

如果你真的需要使用AJAX ......

我遇到的是使用过的处理器并不是正确的选择.在我的情况下通过JavaScript打印.因此,实际上有两个选项可以使用AJAX样式:

解决方案1

使用Base64图像数据和REST图像服务.如果您有自己的Web服务,则可以添加以Base64编码提供图像的JSP/PHP REST脚本.现在这有用吗?我遇到了一种很酷的图像编码新语法:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhE..."/>
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用Ajax加载Image Base64数据,然后在完成时将Base64数据字符串构建到映像!非常有趣 :).我建议使用此站点http://www.freeformatter.com/base64-encoder.html进行图像编码.

$.ajax({ 
    url : 'BASE64_IMAGE_REST_URL', 
    processData : false,
}).always(function(b64data){
    $("#IMAGE_ID").attr("src", "data:image/png;base64,"+b64data);
});
Run Code Online (Sandbox Code Playgroud)

溶液2:

欺骗浏览器使用其缓存.当资源在浏览器缓存中时,这为您提供了一个很好的fadeIn():

var url = 'IMAGE_URL';
$.ajax({ 
    url : url, 
    cache: true,
    processData : false,
}).always(function(){
    $("#IMAGE_ID").attr("src", url).fadeIn();
});   
Run Code Online (Sandbox Code Playgroud)

但是,这两种方法都有其缺点:第一种方法仅适用于现代浏览器.第二个有性能故障,并依赖于如何使用缓存的假设.

欢呼,意志


hth*_*tho 11

使用jQuery,您可以简单地将"src"属性更改为"data-src".图像将无法加载.但该位置标签一起存储.我喜欢哪个.

<img class="loadlater" data-src="path/to/image.ext"/>
Run Code Online (Sandbox Code Playgroud)

一个简单的jQuery将data-src复制到src,它将在您需要时开始加载图像.在我的情况下,页面已完成加载.

$(document).ready(function(){
    $(".loadlater").each(function(index, element){
        $(element).attr("src", $(element).attr("data-src"));
    });
});
Run Code Online (Sandbox Code Playgroud)

我敢打赌jQuery代码可以缩写,但这种方式是可以理解的.

  • 提示:如果你正在使用`data -`标签,通过`$(element).data('src')`代替`$(element).attr('data-src'来访问它们会更容易一些. ")` (4认同)

Jas*_*eem 8

$(<img />).attr('src','http://somedomain.com/image.jpg');
Run Code Online (Sandbox Code Playgroud)

应该比ajax更好,因为如果它是一个图库并且你循环遍历图片列表,如果图像已经在缓存中,它将不会向服务器发送另一个请求.它将在jQuery/ajax的情况下请求并返回HTTP 304(未修改),然后使用来自缓存的原始图像(如果已经存在).上述方法在库中的第一个图像循环之后减少了对服务器的空请求.


小智 5

您可以使用延迟对象进行异步加载。

function load_img_async(source) {
    return $.Deferred (function (task) {
        var image = new Image();
        image.onload = function () {task.resolve(image);}
        image.onerror = function () {task.reject();}
        image.src=source;
    }).promise();
}

$.when(load_img_async(IMAGE_URL)).done(function (image) {
    $(#id).empty().append(image);
});
Run Code Online (Sandbox Code Playgroud)

请注意:image.onload 必须位于 image.src 之前,以防止缓存出现问题。