我想使用 forEach 方法更改歌曲名称,但它不会更改,也不会显示任何错误

I want to change song name by using forEach method but it doesn't change and doesn't show any error

我想执行基本操作,例如更新文档数组。在此 html 中,我有包含歌曲项目 class 的歌曲列表(歌曲容器)。我想更改每首歌曲的名称,我尝试了以下代码,但没有收到想要的输出。

let songItem = Array.from(document.querySelector(".songItem"));
let songs = [
    {
        Name: "love  you zindagi",
        filePath: "audio/song1.mp3",
        coverPath: "covers/download.jpg",
    },
    {
        Name: "zara-zara",
        filePath: "audio/song5.mp3",
        coverPath: "covers/download.jpg",
    },
    {
        Name: "vaaste",
        filePath: "audio/song8.mp3",
        coverPath: "covers/download.jpg",
    },
];

console.log(songs);

songItem.forEach((element, i) => {
    console.log(element, i);
    element.getElementsByClassName("songName")[0].innerText = songs[i].Name;
});
<div class="songList">
    <h1>Best Song Collection</h1>
    <div class="songItem">
        <span class="image">
            <img src="covers/download.jpg" />
        </span>
        <span class="songName">love you zindagi</span>
        <span class="timePlay"
            ><i class="far fa-play-circle" onclick="songPlay ()"></i
        ></span>
        <span class="timeStop"
            ><i class="far fa-pause-circle" onclick="pauseSong ()"></i
        ></span>
    </div>
    <div class="songItem">
        <span class="image">
            <img src="covers/download.jpg" />
        </span>
        <span class="songName">love you zindagi</span>
        <span class="timePlay"><i class="far fa-play-circle"></i></span>
    </div>
    <div class="songItem">
        <span class="image">
            <img src="covers/download.jpg" />
        </span>
        <span class="songName">love you zindagi</span>
        <span class="timePlay"><i class="far fa-play-circle"></i></span>
    </div>
</div>

querySelector returns 匹配选择器的第一个元素。使用 querySelectorAll 来获取所有匹配元素的可迭代对象。

let songItem = Array.from(document.querySelectorAll(".songItem"));
let songs = [
    {
        Name: "love  you zindagi",
        filePath: "audio/song1.mp3",
        coverPath: "covers/download.jpg",
    },
    {
        Name: "zara-zara",
        filePath: "audio/song5.mp3",
        coverPath: "covers/download.jpg",
    },
    {
        Name: "vaaste",
        filePath: "audio/song8.mp3",
        coverPath: "covers/download.jpg",
    },
];

console.log(songs);

songItem.forEach((element, i) => {
    console.log(element, i);
    element.getElementsByClassName("songName")[0].innerText = songs[i].Name;
});

如前面的答案所述,这一行

let songItem = Array.from(document.querySelector(".songItem"));

return 仅第一个具有 class 名称的元素 "songItem"。为了 return 所有这些,您需要使用 querySelectorAll。此外,您不必使用 Array.from()。因此,您可以改用这一行:

let songItem = document.querySelectorAll(".songItem");

另一方面,在最后一行中,使用 element.getElementsByClassName("songName")[0] 可能不是最佳做法,因为“element”只有一个子元素 class 名称为“songName”,您可以在这种情况下使用 querySelector;像这样:

element.querySelector(".songName").innerText = songs[i].Name;