let allData = []; let currentActive = null; // 定义一个函数,用于将字符串中的反斜杠替换为正斜杠 function sanitize(str) { return str.replaceAll("\\", "/"); } function renderList(data) { const list = document.getElementById("resourceList"); list.innerHTML = ""; data.forEach((item, index) => { const li = document.createElement("li"); li.setAttribute("data-index", index); const thumb = item.images?.[0] ? sanitize(item.images[0]) : ""; const name = item.title; const assets = item.properties?.Assets || "未知"; li.innerHTML = `
${name}
素材量: ${assets}
`; li.addEventListener("click", () => showDetails(item, li)); list.appendChild(li); }); } function showDetails(item, li) { if (currentActive) currentActive.classList.remove("active"); currentActive = li; currentActive.classList.add("active"); document.getElementById("placeholder").classList.add("hidden"); document.getElementById("details").classList.remove("hidden"); document.getElementById("detailTitle").textContent = item.title; document.getElementById("detailTags").textContent = `分类: ${ item.properties?.Category?.[0] || "N/A" } | 标签: ${(item.properties?.Tags || []).join(", ")}`; // 下载链接 const download = sanitize(item.download); document.getElementById( "downloadBlock" ).innerHTML = `⬇️ 下载资源`; // 图集 const gallery = document.createElement("div"); gallery.id = "gallery"; item.images?.forEach((img) => { img = sanitize(img); const a = document.createElement("a"); a.href = img; a.innerHTML = ``; gallery.appendChild(a); }); const galleryWrapper = document.getElementById("galleryWrapper"); galleryWrapper.innerHTML = ""; galleryWrapper.appendChild(gallery); lightGallery(gallery, { selector: "a", thumbnail: true, zoom: true, }); // 版本信息 const versionBlock = document.getElementById("versionTableWrapper"); if (item.changelog?.length > 0) { let table = ``; item.changelog.forEach((row) => { table += ``; }); table += `
日期版本描述
${row.date}${row.version}${ row.description || "" }
`; versionBlock.innerHTML = table; } else { versionBlock.innerHTML = ""; } } function handleSearch() { const keyword = document .getElementById("searchInput") .value.trim() .toLowerCase(); const filtered = allData.filter((item) => item.title.toLowerCase().includes(keyword) ); renderList(filtered); } fetch("data/kenney_data_local.json") .then((res) => res.json()) .then((data) => { allData = data; renderList(data); document .getElementById("searchInput") .addEventListener("input", handleSearch); });