【发布时间】:2017-09-27 14:38:00
【问题描述】:
我正在使用 JavaScript 预加载多个图像,并为每个图像分配一些样式属性,这是可能的,因为这些是 HTML 图像元素。我使用了 Promise 技术,我在 StackOverflow 上找到了 here:
function preloadImages(srcs) {
function loadImage(imgToLoad) {
return new Promise(function(resolve, reject) {
var img = new Image();
img.onload = function() {
resolve(img);
};
img.onerror = img.onabort = function() {
reject(imgToLoad.src);
};
img.className = 'testimg'; //Test to see if I can retrieve img
img.src = imgToLoad.src;
img.style.top = imgToLoad.top;
});
}
var promises = [];
for (var i = 0; i < srcs.length; i++) {
promises.push(loadImage(srcs[i]));
}
return Promise.all(promises);
}
“srcs”取值示例:
srcs[0].top = '15%';
srcs[0].src = 'img/myImage1.jpg';
srcs[1].top = '24%';
srcs[1].src = 'img/myImage2.jpg';
预加载部分完美运行,我能够在流程结束时获取所有预加载的图像,看到样式属性已被应用,如下所示:
preloadImages(imgToLoad).then(function(imgs) {
// all images are loaded now and in the array imgs
console.log(imgs); // This works
console.log(document.getElementsByClassName('testimg')); //This doesn't
}, function(errImg) {
// at least one image failed to load
console.log('error in loading images.');
});
但是,稍后在我的代码中,我想从预加载的图像数组中获取一些元素,这样我就可以附加它们而无需精确的样式属性。
我的意思不仅仅是 .append('aSrcThatHasBeenPreloaded'); 。 我想保留我在预加载期间定义的类和样式属性。
这可能吗?如果是这样,我应该如何进行?
我尝试了document.getElementsByClassName('myPreloadedClass'),但它返回一个空结果,这意味着预加载的图像不是 DOM 的一部分(这很有意义)。
感谢您的帮助。
【问题讨论】:
-
你能举一个
srcs的值的例子吗? -
我编辑添加了一个简单的例子。但是,我很确定这部分是正确的,因为在该过程结束时,我想要的每张图像都已加载并且我返回的承诺是正确的。我的问题更多的是关于预加载在浏览器中的工作方式以及以后检索预加载数据的方法。
-
要使用
getElementsByClassName(),图像必须附加到DOM。如果不这样做,您总是可以遍历数组并直接检查 imgs[n].className(或使用 imgs[n].classList.contains(classname))。您当然会将 img 存储在可以再次访问它们的地方。 -
嗨,我无法访问代码部分中的数组,但也许这是要走的路,通过我稍后将使用的变量访问它。谢谢,我会试试这个想法。
-
@Driblou 是的,您通常会将对数组的引用存储在全局范围内。
标签: javascript html image preloading