【问题标题】:detecting img loads in javascript检测 javascript 中的 img 负载
【发布时间】:2013-08-19 06:18:15
【问题描述】:

我有一个函数,我将 img src 值作为参数,我想做的是检查该图像加载时是否出现 200 ok 或 404/其他错误。如果它得到 200 ok,那么我想将带有该 src 的 img 标签注入到 DOM 中(我认为在检查期间,它也会被加载到浏览器缓存中,并将该 img 标签注入 DOM 会从缓存中加载它) .我尝试了一个简单的 sn-p 代码,如下所示:

function checkImage(src)
{
   var img = new Image(),
   tag = '<img src="'+src+'" />',
   alt = '<span>sorry,image broken</span>';
   img.onload = function(){
       $('.some-container').html(tag);
   };
   img.onerror = function(){
      $('.some-container').html(alt);
   };
   img.src = src;
}

它在 chrome 中运行良好,但在 firefox 和 ie 中运行良好(无论图像加载正常还是损坏,它们都只触发错误事件)。我没有使用 onload 和 onerror,而是使用 jquery 进行了尝试:

$(img).load(...).error(...).attr('src',url);

$(img).on('load',...).on('error',...).attr('src',url);

$('<img />').load(...).error(...).attr('src',url);

$('<img />').on('load',...).on('error',...).attr('src',url);

甚至尝试了 desandro(https://github.com/desandro/imagesloaded) 的 jquery.imagesLoaded 插件,例如:

$(img).imagesLoaded().done(...).fail(...);

$(img).imagesLoaded().progress(function(instance,image){
    image.isLoaded?alert('loaded'):alert('broken');
});

$('<img />').imagesLoaded().done(...).fail(...).attr('src',url);

$('<img />').imagesLoaded().progress(function(instance,image){
    image.isLoaded?alert('loaded'):alert('broken');
});

我还尝试了以下解决方案:

jQuery callback on image load (even when the image is cached)

https://groups.google.com/forum/#!topic/jquery-dev/7uarey2lDh8

但事实证明,可以在 chrome 中工作,但不能在 FF 或 IE 中工作,是否有任何解决方案可以检查内存中存在但“DOM”中不存在的图像?提前致谢。

【问题讨论】:

  • 经过严格检查,我发现了img.onload没有被触发的原因,原来我给的url是错误的,除了上述函数,我是从DOM,然后把它交给这个函数来检查它们是否应该被注入到 DOM 中,结果证明 FF 在我没有删除的 bg-url 中包含了一组额外的“”(双引号),并且因此它们导致错误事件总是被触发。似乎最基本的img.onload,img.onerror按预期工作,感谢您的所有帮助:)

标签: javascript jquery image onload onerror


【解决方案1】:

您必须在为其设置来源后检查图像加载。

  var img = new Image();
  //set source to the image
  img.src = "set/image/source/path"

  img.onload = function(){

    //if image load is successful
    //create an jQuery object out of this image
    var jQimage = $(this);
    $('.myContainer').html(jQimage);

  }

另请注意,jQuery 加载功能不能保证您可以跨浏览器检查图像加载,如 jQuery docs 中所述

因此,最好的方法是使用原生 javascript 检查 onload,并在必要时创建一个 jQuery 对象以使用 jQuery 方法。

【讨论】:

  • 为什么? img.onloadimg 加载后被触发。如果图像将从缓存中加载,它可能在onload 函数定义之前就准备好了,那么事件根本不会触发。在onload 处理程序之后设置src 确保不会发生这种情况。
  • 如果图像已经加载,那么您可以重用该图像对象,因为有时如果尝试加载相同的图像(即具有相同的源)浏览器会忽略 onload。而且,至于您的方法,如果您不向图像对象添加源,则不会调用 onload,因为没有要加载的内容。
  • 我认为顺序不会有任何区别,如果这是您的要求。欢迎您尝试。每当将图像设置为源时,它都会获取图像对象并侦听 onload 处理程序(如果有)。定义 onload 处理程序的位置可以在设置源之前或之后。无论如何都会调用它。
  • 我认为@Teemu 所说的正确,但我检查并发现你所说的也是正确的,在加载图像时,它会检查它是否有任何绑定的 onload 事件处理程序和如果存在则调用它,但进入主题,因为没有区别(我也尝试过你的 sn-p),firefox 仍然不会为图像对象(不是 DOM 对象)调用 onload 事件。跨度>
【解决方案2】:

看看 w3schools 对 Image() javascript 对象的看法。

http://www.w3schools.com/jsref/dom_obj_image.asp

onabort - 图像加载中断,W3C YES

onerror - 加载图片时出错,W3C YES

onload - 图像已完成加载,W3C YES

也是 Image() 对象的完整属性,确定浏览器是否完成加载图像,不幸的是这个特定属性不是 W3c

希望对你有所帮助

PS:在谷歌搜索后,我从 Stack Overflow 中找到了这个 Q/A。

Cross-browser image onload event handling

【讨论】:

  • 那些很有帮助是的,我开始提到它,我相信 onabort 不是在我的情况下调用的事件,因为我没有在下载图像的中途更改 src,它只是当图像对象存在于浏览器缓存中时,FF 和 IE 似乎不会为图像对象调用 onload 事件。
  • 看看我编辑的答案,我从堆栈中找到了以前的 Q/A :)
  • 谢谢詹姆斯,但它也不起作用,很可能是因为 .load() 不适用于浏览器缓存中已经存在的图像,它在 jquery 文档中也是如此- api.jquery.com/load-event 在我提供的链接中提到了它的警告:)
  • 嘿,我刚刚发现了一个令人毛骨悚然的错误,我将它作为评论包含在我原来的问题中,请花点时间阅读:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多