2012-09-27 65 views
1

我对所有的Javascript资料仍然陌生,我必须诚实地说,我还没有试验任何与我的问题有关的东西。jQuery,如何预加载图像并在图像加载时得到通知?

我想知道是否有一种方法或插件与jQuery预加载多个图像和图像加载时调用函数?

+0

可能重复://计算器。 com/questions/4506825/preload-images-using-jquery) –

回答

2

您可以使用load事件来处理图像,但它们有一些跨浏览器问题(这取决于您定位的平台)。

var allImgs = $("#container img").filter(function() { return ! this.complete; }); 
var allImgsLength = allImgs.length; 

allImgs.on("load", function() { 
    if (--allImgsLength) { 
     // Images have loaded. 
    } 
}); 

如果你不介意的话,包括一个插件,有waitForImages(免责声明:我写的),其中处理这个比较好听。 :)

你会使用它就像...

$("#container").waitForImages(function() { 
    // Images have loaded. 
}); 

如果你不想使用jQuery的一切,你能适应的第一个例子。如果您只指定现代浏览器...

var allImgs = [].filter.call(document.querySelectorAll("#container img"), 
          function(img) { 
           return ! img.complete; 
          }); 
var allImgsLength = allImgs.length; 

[].forEach.call(allImgs, function(img) { 
    img.addEventListener(function() { 
     if (--allImgsLength) { 
      // Images have loaded. 
     } 
    }); 
}); 

如果你必须支持旧的浏览器...(HTTP [使用jQuery预先载入图像]的

var allImgs = document.getElementById("container").getElementsByTagName("img"); 
var allImgsLength = allImgs.length; 
var i; 
var eventCallback = function() { 
         if (--allImgsLength) { 
          // Images have loaded. 
         } 
        }; 

for (i = 0; i < allImgsLength; i++) { 
    if (allImgs[i].complete) { 
     allImgsLength--; 
    } 

    if (allImgs[i].addEventListener) { 
     allImgs[i].addEventListener("load", eventCallback); 
    } elseif (allImgs[i].attachEvent) { 
     allImgs[i].attachEvent("onload", eventCallback); 
    } else { 
     allImgs[i].onload = eventCallback; 
    } 
} 
+0

感谢您的回复。所以,如果我的理解正确,我可以创建一个不可见的div容器,在其中放置一些图像,当它们全部加载时,我将能够独立于div检索图像并将它们放在不同的倍数中容器我想要的方式?图像已经被加载了? – SlashJ

+0

@Armz是的,你可以做到这一点。这不是严格意义上的插件设计,但我在过去取得了成功。 – alex

+0

棒极了,竖起大拇指! – SlashJ