You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

利用Local Storage跨页面同步数据,实现单详情页展示多歌曲信息

解决方案

你的核心问题是详情页没有读取URL中携带的歌曲索引,导致无法定位到具体要展示的歌曲。下面是具体修改步骤:

1. 修复detail.js的核心逻辑

修改detail.js,先获取URL hash中的歌曲索引,再用这个索引从存储的歌曲数组中取出对应歌曲的数据:

var songJSON = localStorage.getItem("songStoreData");
var Obj = JSON.parse(songJSON);
console.log(Obj);

function addDetails(){
    // 获取URL中的hash值(就是你在index.html里加的歌曲索引)
    // 比如URL是detail.html#0,这里就会得到"0",转成数字
    var songIndex = parseInt(window.location.hash.slice(1));
    
    // 校验索引是否有效,避免非法访问
    if(isNaN(songIndex) || songIndex < 0 || songIndex >= Obj.songs.length){
        // 索引无效的话跳回列表页
        window.location.href = "index.html";
        return;
    }
    
    // 获取当前要展示的歌曲对象
    var currentSong = Obj.songs[songIndex];

    // 把歌曲数据插入到页面元素中
    document.getElementById('span_header').innerHTML = '<a href="index.html"><img id="btn_product_details_back" src="img/back_white.png">' + currentSong.artist + '</a>';
    document.getElementById('div_product_details_img').innerHTML = '<img src="' + currentSong.image + '">';
    document.getElementById('data_name').innerHTML = currentSong.name;
    document.getElementById('data_genre').innerHTML = currentSong.genre;
    document.getElementById('data_release').innerHTML = currentSong.release;
    document.getElementById('data_duration').innerHTML = currentSong.duration;

    // 这里不需要重新存localStorage,数据没修改
    // localStorage.setItem("songStoreData", Data);
    
    return false;
}
  
addDetails();

2. 修复index.js中的小错误

你在生成li元素时,类名的引号写错了,会导致HTML结构错误:
原代码:

'<li class="li_product_"' + i + '">'

修改为:

'<li class="li_product_' + i + '">'

(去掉多余引号,确保类名是li_product_0、li_product_1这类正确格式)

3. 额外优化建议

  • 简化index.js的存储逻辑,直接用fetch返回的数据渲染,减少localStorage操作:
    fetch('x')
    .then(res => res.json())
    .then(data => {
        // 仅当localStorage无数据时才存储
        if(!localStorage.getItem("songStoreData")){
            localStorage.setItem("songStoreData", JSON.stringify(data));
        }
        // 直接使用fetch到的data,无需重复读取localStorage
        const songs = data.songs;
        for(let i = 0; i < songs.length; i++){
            homeList.innerHTML += '<li class="li_product_' + i + '"><div class="li_product_image"><img src="' + songs[i].image + '"></div><div class="li_product_name"><a href="detail.html#' + i + '">' + songs[i].name + ', ' + songs[i].artist + '</a><br><span class="li_product_duration">' + songs[i].duration + ' minutes</span></div></li>';
        }
    })
    
  • 循环中用let i代替全局i,避免变量污染。

内容的提问来源于stack exchange,提问作者obeselizard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:15:37