当图片加载完成时,会触发图片的
load
事件。需要注意的是,如果您在图片加载之前没有连接好处理程序,那么您的处理程序将不会被调用。浏览器会并行加载资源,因此即使在jQuery的
ready
事件中表示页面的DOM已经准备就绪,您也无法确定图片是否已经在代码运行时加载完毕。
您可以使用图片对象的
complete
属性来判断图片是否已经加载完成,例如:
var firstPhoto = $("#photos img:first");
if (firstPhoto[0].complete) {
// Already loaded, call the handler directly
handler();
}
else {
// Not loaded yet, register the handler
firstPhoto.load(handler);
}
function handler() {
alert("Image loaded!");
}
如果浏览器真的实现了多线程加载,那么在此过程中可能会出现竞争条件,其中图像加载可能发生在不同于Javascript线程的线程上。
当然,如果您的选择器将匹配多个图像,则需要处理它;您的选择器似乎只应该匹配一个,所以...
编辑 此版本允许多个图像,并且我认为它处理了任何非Javascript竞争条件(当然,目前还没有Javascript竞争条件;在浏览器中,Javascript本身是单线程的[除非您使用新的web workers内容]):
function onImageReady(selector, handler) {
var list;
list = typeof selector === 'string' ? $(selector) : selector;
list.each(function(index, element) {
if (element.complete) {
setTimeout(function() {
fireHandler.call(element);
}, 0);
}
else {
$(element).bind('load', fireHandler);
}
});
function fireHandler(event) {
$(this).unbind('load', fireHandler);
handler.call(this);
}
}
onImageReady("#photos img:first");
几点注意事项:
- 回调函数不会返回
event
对象;如果需要的话你可以修改代码,但是当图片已经加载完成时,则没有必要返回事件对象,因此这个功能可能没什么实际用处。
- 你也许可以使用
one
而不是bind
和unbind
,但我喜欢保持代码清晰易懂,因为我有点小心眼。 :-)
ready
事件的参考资料吗?我所知道的唯一ready
事件是jQuery的“DOM准备就绪”事件,这完全不同。 - T.J. Crowder