如何在firefox中处理“图像损坏或截断”

插入

我正在使用一个名为lazyload的jQuery插件。

这样做的是lazy加载图像 – 这意味着它不会在浏览器中呈现它们,直到图像在视口范围内。

例如,当您拥有包含许多图像的页面时,这非常有用,并且您不希望它在初始加载时永远消耗。

FIREFOX

好的,所以我也使用Firefox版本23.0.1

问题

插件很棒,但是当在一些图像之后向下滚动时,我开始得到图像无法加载的错误(只有一个通用的占位符用于损坏的图像链接),并在控制台中记录:

Image corrupt or truncated: [image url]

并不是图像有问题。 它们都可以单独渲染。

它不是SPECIFIC图像,因为它是随机的。 如果我再次加载页面,现在可能会加载corrupt的图像,其他图像返回断开的链接并在控制台中记录corrupt

我四处寻找这个,似乎同时提取 src标签存在一些问题。

可能应该在获取时设置延迟,但是你不能总是知道延迟应该有多长。 如果一个图像比另一个图像大,它仍然可能会发生冲突(静态延迟时间,而不是complete回调)。

因此, 我想要求:

a)如果有人知道解决方案(例如在发生错误时捕获并重新触发加载图像function)
b)如果任何人可以向上面的库(lazyload)提出$.extend() ,它将创建一个回调函数并等到所有活动的提取complete后再加载下一个(如果这是问题 – 我不确定是否它是) 我不是一个jQuery忍者所以我在代码上有点迷失。 我可以搞清楚,但它可能很脏……
c)如果这不是问题,那么我可以理解如何解决这个问题

正如对此类问题的答案所建议:

看来,在更改img标记的src属性时,Firefox会触发加载事件。 这与HTML5规范相反,HTML5规范说如果更改了src属性,那么任何其他正在进行的提取都应该结束 (Firefox会这样做), 并且不应该发送任何事件 。 只有在成功完成提取时才应发送load事件。 所以我要说你得到一个加载事件的事实是一个Firefox错误。

然后:

最好的选择可能是每次要更改src属性时创建一个新元素。

这是有道理的。 在lazyload代码中,您将找到这一部分,这似乎是图像加载时,响应触发的滚动事件appear

  /* When appear is triggered load original image. */ $self.one("appear", function() { if (!this.loaded) { if (settings.appear) { var elements_left = elements.length; settings.appear.call(self, elements_left, settings); } $("") .bind("load", function() { var original = $self.attr("data-" + settings.data_attribute); $self.hide(); if ($self.is("img")) { $self.attr("src", original); } else { $self.css("background-image", "url('" + original + "')"); } $self[settings.effect](settings.effect_speed); self.loaded = true; 

您可以将AND运算符后跟一些标志或函数返回,以validation最后一个映像是否已在该部分上完全加载:

 if ($self.is("img") && lastImageIsLoadde() === true) { /*pseudocode here*/ 

从而防止img src在正确的时间之前被替换(因为settings.placeholder是脚本在滚动时代替要加载的图像所代替的图像)并且看它是否适合你。

如果你有lazyload库的更新版本,我会先检查一下。 https://github.com/tuupola/jquery_lazyload/blob/master/jquery.lazyload.min.js

目前v 1.9.7是最新的。 这可能是他们已经修复的错误。 (changelog: https : //github.com/tuupola/jquery_lazyload/blob/master/CHANGELOG.textile )

其次,你使用的是jQuery版吗? 也许一个非常古老的jQuery与旧的lazyload库导致这个问题? (或者也许是最新的jQuery?)

如果这一切都很好,也许你可以看一下lazyload是如何启动的? 你有ajax请求并重新启动延迟加载吗? (不应该引起问题,但你永远不知道)。 或尝试不同的doctype / html结构?

如果什么都不起作用,我会把html文档“删除”到一个非常干净的版本,其中lazyloading工作(只是localhost测试,或jsfiddle或其他)并逐个放回部分。 最终你应该看到function中断的地方。

使用jQuery v1.9.1和Lazyload v1.9.7,它应该只适用于:

 $('.lazy').lazyload(); 

这是一个测试的jsfiddle: http : //jsfiddle.net/web_nfo/21qb88v1/

或许Firefox只是问题所在。 目前版本40是最近的版本。 也许您还安装了’beta’版本? 还是安全模式?