【发布时间】:2021-05-11 21:03:10
【问题描述】:
我正在构建一个从 JSON 文件填充的图片库。目前一切都按预期工作,但目前在初始页面加载后没有预加载内容。我想要发生的是在单击“查看更多”按钮后我会有一些“加载”文本显示,这批图像将预加载,“加载”文本将消失,然后图像将添加到页面一旦所有项目都加载完毕。
以下是涉及 JSON 获取请求和在页面上构建元素的代码部分:
var HTML = '';
var itemsStart = 6; // Starting number of items on page.
var itemsAdd = 9; // Number of items to add to page at a time via button click.
var pItems = document.getElementById('pItems');
var pWrapper = document.getElementById('pItemWrapper');
function addProjects() {
pItems.insertAdjacentHTML('beforeend', HTML);
console.log('BUILD PROJECTS');
}
//Load json
fetch('data/projects.json').then(function (response) {
return response.json();
}).then(function (data){
//Loop through first set of items to load on page.
for (var i = 0; i < itemsStart; i++) {
HTML += '<img src="' + data.projects[i].Image + '" alt=""></img>';
if (i == (itemsStart - 1)) {
addProjects();
}
}
//Load additional items when clicking 'view more'.
document.getElementById('view-more').addEventListener('click', function() {
HTML = '';
for (var i = itemsStart; i < itemsStart + itemsAdd; i++) {
if ((i < data.projects.length)) {
HTML += '<img src="' + data.projects[i].Image + '" alt=""></img>';
}
if (i == ((itemsStart + itemsAdd) - 1) ) {
addProjects();
}
}
itemsStart = itemsStart + itemsAdd;
});
}).catch(function(error) {
console.error('Something went wrong');
});
我没有使用 jQuery,所以我想坚持使用 vanilla js。除了我所拥有的之外,我不知道我需要向按钮事件侦听器添加什么,我从未尝试过在不使用插件的情况下预加载这样的图像,但我觉得我不需要为此加载整个插件一件事,我想了解它是如何工作的。
编辑
我觉得我快到了,但我还是有问题。我做了一些修改,让每个项目都放在自己的容器中,但我没有为循环的每个通道创建一个空容器,然后最后一个容器将每个图像添加到其中。我的代码如下所示:
var itemsAdd = 3;
//Load additional items when clicking 'view more'.
document.getElementById('view-more').addEventListener('click', function() {
//The loop will add the next 3 items in the json file per click.
for (var i = itemsStart; i < itemsStart + itemsAdd; i++) {
var placeholder = document.createElement('div');
var src = 'img/portfolio/' + data.projects[i].url;
placeholder.innerHTML= '<div class="img-container"><a href="projects/'+ data.projects[i].ImageName +'" class="fig-container">' + data.projects[i].Title + '</a></div>';
var galleryItem = placeholder.firstChild;
preloadImage(src).then(function (image) {
galleryItem.append(image);
});
pItems.append(galleryItem);
}
itemsStart = itemsStart + itemsAdd;
});
我得到的结果是这样的:
这是因为 promise 对 preloadImage 函数的作用吗?
【问题讨论】: