适当的jQuery图像加载()?
jQuery(document).ready(function(){ setTimeout(function(){ jQuery('.my-image').each(function(){ jQuery(this).greyScale({ fadeTime: 200, reverse: false }); $(this).animate({ 'opacity' : 1 }, 1000); $(this).load(function(){ jQuery(this).greyScale({ fadeTime: 200, reverse: false }); $(this).animate({ 'opacity' : 1 }, 1000); }); }); }, 200); });
在上面的例子中,我使用greyScale()函数将图像复制到canvas并保留两个版本(灰色=默认,颜色=hover)。
它在99%的时间内工作正常但是当浏览器第一次运行时,它有时无法加载1个图像,2个图像或类似的东西。 这就像“加载”和“正常事件”都无法工作。
有人可以确认我做得对吗? 我尝试加载该事件,如果图像已经存在或者它不在那里那么可以选择“load()”以确保它在加载后执行。 从逻辑上讲,这似乎是一个很好的解
测试图像是否已加载的一种好方法是尝试访问其尺寸,如果可以获得图像的高度或宽度,则可以假设它已加载并对其进行灰度化。 因此,您可以修改代码来执行此操作:
jQuery('.my-image').each(function() { var greyscale = function(image) { jQuery(image).greyScale({ fadeTime: 200, reverse: false }); } if ( jQuery(this).width() ) { // it's loaded, greyscale its ass greyscale( this ); } else { // wait for the load $(this).load(greyscale); } });
在这种情况下,由于您希望图像首先是灰度,我建议以编程方式插入图像:
如果你的标签在哪里,用你添加
data-src
属性的
标签替换它们,这将包含图像的URL。
当您加载文档时,请使用遍历所有
标记的脚本并在
标记内插入
标记,例如:
jQuery('div.my-image').each(function() { var el = jQuery( this ); // get the src for the image var src = el.data( 'src' ); // start loading the image var img = new Image(); img.onload = function() { // greyscale it jQuery(img).greyScale({ fadeTime: 200, reverse: false }); // append it el.append( img ); } // load the image by setting the src img.src = src; });
不要依赖.load()
函数来处理图像。
甚至jQuery也这么说。
与图像一起使用时加载事件的注意事项
开发人员尝试使用.load()快捷方式解决的常见挑战是在图像(或图像集合)完全加载时执行函数。 应该注意有几个已知的警告。 这些是:
它不能一致地工作也不能可靠地跨浏览器如果图像src设置为与之前相同的src它在WebKit中无法正确激活它没有正确地冒泡DOM树可以停止为已经存在的图像触发在浏览器的缓存中
在这里阅读
如果可以,请使用此,
$(window).load(function(){ // Images are now loaded for sure })
编辑:
或者使用Paulirish的非常精简的jQuery插件
imageLoaded
.load()
可能是一个棘手的问题,但这样的事情应该有效(请注意this.complete检查):
jQuery('.my-image').each(function(){ $(this).load(function(){ jQuery(this).greyScale({ fadeTime: 200, reverse: false }); $(this).animate({ 'opacity' : 1 }, 1000); }); if (this.complete) { $(this).trigger('load'); } });
尽量避免重复代码,这不是最好的练习。