我在下面编写的函数是否足以在当今常用的大多数(如果不是全部)浏览器中预加载图像?
function preloadImage(url)
{
var img=new Image();
img.src=url;
}
我有一组图像 URL,我循环遍历preloadImage
这些 URL并为每个 URL调用函数。
我在下面编写的函数是否足以在当今常用的大多数(如果不是全部)浏览器中预加载图像?
function preloadImage(url)
{
var img=new Image();
img.src=url;
}
我有一组图像 URL,我循环遍历preloadImage
这些 URL并为每个 URL调用函数。
是的。这应该适用于所有主要浏览器。
对于任何感兴趣的人,这里有一些 OP 提供的代码的替代方法。
preloadImage()
函数现在返回
function preloadImage = function(url){
const img = new Image();
img.src = url;
return img
}
preloadImages()
返回Image
函数返回的类型化对象数组。用于检查预加载状态。
function preloadImage(url){
const img = new Image();
img.src = url;
return img
}
function preloadImages() {
const images = []
for (var i = 0; i < arguments.length; i++) {
images[i] = preloadImage(arguments[i])
}
return images
}
//-- usage --//
const images = preloadImages(
"http://domain.tld/gallery/image-001.jpg",
"http://domain.tld/gallery/image-002.jpg",
"http://domain.tld/gallery/image-003.jpg"
)
preloadImages()
类型不安全
用Image
类型对象覆盖提供的数组。返回Image
函数返回的类型化对象数组。用于检查预加载状态。
function preloadImage(url){
const img = new Image();
img.src = url;
return img
}
function preloadImages(images) {
for (var i = 0; i < images.length; i++) {
images[i] = preloadImage(images[i])
}
return images
}
//-- usage --//
let arr = [
"http://domain.tld/gallery/image-001.jpg",
"http://domain.tld/gallery/image-002.jpg",
"http://domain.tld/gallery/image-003.jpg"
]
const images = preloadImages(arr)
console.dir(images)
preloadImages()
类型安全。返回Image
函数返回的类型化对象数组。用于检查预加载状态。
function preloadImage(url){
const img = new Image();
img.src = url;
return img
}
function preloadImages() {
const images = []
let c = 0
for (var i = 0; i < arguments.length; i++) {
if (Array.isArray(arguments[i])) {
for(var arr = 0; arr < arguments[i].length; arr++) {
if(typeof arguments[i][arr] == 'string') {
images[c] = preloadImage(arguments[i][arr])
c++
}
}
}
else if(typeof arguments[i] == 'string') {
images[c] = preloadImage(arguments[i])
c++
}
}
return images
}
//-- usage --//
var arr = [
"http://domain.tld/gallery/image-001.jpg",
"http://domain.tld/gallery/image-002.jpg"
]
const images = preloadImages(
arr,
"http://domain.tld/gallery/image-003.jpg",
"http://domain.tld/gallery/image-004.jpg",
[
"http://domain.tld/gallery/image-005.jpg",
"http://domain.tld/gallery/image-006.jpg"
]
)
console.dir(images)
灵感来源于:http : //perishablepress.com/3-ways-preload-images-css-javascript-ajax/
就我而言,为onload
事件添加回调函数很有用:
function preloadImage(url, callback)
{
var img=new Image();
img.src=url;
img.onload = callback;
}
然后将其包装为一组 URL 到图像的情况,这些图像将通过回调预加载完成:https : //jsfiddle.net/4r0Luoy7/
function preloadImages(urls, allImagesLoadedCallback){
var loadedCounter = 0;
var toBeLoadedNumber = urls.length;
urls.forEach(function(url){
preloadImage(url, function(){
loadedCounter++;
console.log('Number of loaded images: ' + loadedCounter);
if(loadedCounter == toBeLoadedNumber){
allImagesLoadedCallback();
}
});
});
function preloadImage(url, anImageLoadedCallback){
var img = new Image();
img.onload = anImageLoadedCallback;
img.src = url;
}
}
// Let's call it:
preloadImages([
'//upload.wikimedia.org/wikipedia/commons/d/da/Internet2.jpg',
'//www.csee.umbc.edu/wp-content/uploads/2011/08/www.jpg'
], function(){
console.log('All images were loaded');
});
CSS2 替代方案:http : //www.thecssninja.com/css/even-better-image-preloading-with-css2
body:after {
content: url(img01.jpg) url(img02.jpg) url(img03.jpg);
display: none;
}
CSS3 替代方案:https : //perishablepress.com/preload-images-css3/ (H/T Linh Dam)
.preload-images {
display: none;
width: 0;
height: 0;
background: url(img01.jpg),
url(img02.jpg),
url(img03.jpg);
}
注意:容器中的图像display:none
可能不会预加载。也许可见性:隐藏会更好,但我还没有测试过。感谢 Marco Del Valle 指出这一点
您可以将此代码移动到 index.html 以从任何 url 预加载图像
<link rel="preload" href="https://via.placeholder.com/160" as="image">