【发布时间】:2012-07-09 00:37:13
【问题描述】:
我目前正在使用Jquery Lazy Load,我想知道是否有一种方法可以在我的容器中的所有图像结束加载时进行回调(当延迟加载使他发挥了所有魔力时)。
原因是我也在使用jScrollPane Plugin,我想调用jScrollPane 重新初始化函数。
谢谢'
【问题讨论】:
标签: jquery jquery-plugins callback lazy-loading jscrollpane
我目前正在使用Jquery Lazy Load,我想知道是否有一种方法可以在我的容器中的所有图像结束加载时进行回调(当延迟加载使他发挥了所有魔力时)。
原因是我也在使用jScrollPane Plugin,我想调用jScrollPane 重新初始化函数。
谢谢'
【问题讨论】:
标签: jquery jquery-plugins callback lazy-loading jscrollpane
查看源代码,似乎延迟加载插件在加载图像后调用了settings.load函数,并传递了加载的图像元素和几个参数:
if (settings.load) {
var elements_left = elements.length;
settings.load.call(self, elements_left, settings);
}
所以你可能只需要这样设置:
function yourhandler(element, el_left, settings) {
//Whatever you want
//This function will be called each time that an image (element in this case) is loaded
}
$("img.lazy").lazyload({
load : yourhandler
});
如果您想确保图像已加载,可以将侦听器附加到已加载的图像:
function yourhandler(element, el_left, settings) {
element.load(function() {
alert('Image Loaded');
});
}
尝试代码后,最“干净”的方法是附加到图像的.load 方法:
$('img.lazy').load(function() {
console.log($(this).attr('src') + ' loaded');
});
$('img.lazy').lazyload({
container:$('.p_content'),
});
【讨论】:
yourhandler 不接收元素作为其第一个参数,而是接收 this,因为调用 load 函数时将元素作为上下文。
为了处理最后加载的图像并仅在完成时运行代码(所有图像已加载),您必须使用处理函数,正如 VAShhh 之前所说的,不像函数调用应该只发送 2 个参数,所以这个函数使用 javascript call 语句调用。
然后您将能够成功检索“elements_left”参数并将其与 0(零)进行比较:最后加载的图像左侧。像这样的:
function yourhandler(elements_left, settings) {
var imageNode, container;
if(elements_left === 0) {
// All images were loaded.
// Now do whatever you need with imageNode or its parents (container, etc) in order
// to run any other Plugin
imageNode = $(this);
container = settings.container;
alert('Ready to continue! Image node is $(this) and container settings.container');
}
}
请查看此示例:jsfiddle.net/eRyww/4
【讨论】:
yourhandler(elements_left, settings) 是知道“何时”使用最后一张图像的唯一方法,换句话说:when加载所有图像,而不是每个图像(理解它是开始对话线程的原始案例)。如果这不是你想要的,什么都不会发生,忘记答案。问候。
作为替代答案,我创建了一个“延迟加载”插件,可以做到这一点。它在所有元素加载后提供回调。它有点不同,不仅适用于图像,而且任何时候选定的元素都会出现在浏览器视图窗格中。
【讨论】: