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

如何在HTML模板字面量中嵌入JavaScript forEach循环?

问题描述

需要重复生成9个包含动态类名与属性的HTML代码块,当前采用for循环结合JavaScript模板字面量实现。现有数组:

const allSounds = ["Beachfront","Busy coffee shop","Busy restaurant"]

想要在模板字面量内部通过forEach循环生成额外HTML块,尝试嵌入${}及拆分模板字面量均失败,求正确实现语法。

原代码示例:

for (let i = 0; i < 9; i++) {
    let controlDiv = document.createElement('div');
    controlDiv.setAttribute("class", "control" + i);

    controlDiv.innerHTML =  `
    <audio id="audio${i}" class="player${i}" src="audio/${defaultSounds[i]}.opus" loop></audio>
    <div class="on-off-container">
        <button onclick="onOff('audio${i}', 'btn-icon${i}','displaySpan${i}','on-off${i}')" type="button" class="on-off-btn btn-inactive on-off${i}">
             <i class="fa-solid fa-power-off"></i>
        </button>
    </div>
    `;
    
    document.getElementById("control-grid").appendChild(controlDiv);
}

尝试的错误写法:

for (let i = 0; i < 9; i++) {
    let controlDiv = document.createElement('div');
    controlDiv.setAttribute("class", "control" + i);
    controlDiv.innerHTML =  `
    <audio id="audio${i}" class="player${i}" src="audio/${defaultSounds[i]}.opus" loop></audio>

    allSounds.foreach {
        `[some more HTML to append to the DOM]`;
    }

    <div class="on-off-container">
        <button onclick="onOff('audio${i}', 'btn-icon${i}','displaySpan${i}','on-off${i}')" type="button" class="on-off-btn btn-inactive on-off${i}">
             <i class="fa-solid fa-power-off"></i>
        </button>
    </div>
    `;
    
    document.getElementById("control-grid").appendChild(controlDiv);
}
正确实现语法

核心问题是模板字面量中不能直接写forEach循环逻辑,需要用map生成HTML字符串数组后拼接成完整字符串,再通过${}嵌入模板。同时注意修正forEach的驼峰拼写。

修改后的完整代码:

for (let i = 0; i < 9; i++) {
    let controlDiv = document.createElement('div');
    controlDiv.setAttribute("class", "control" + i);

    // 用map生成allSounds对应的HTML块,join拼接成字符串
    const soundsHTML = allSounds.map((sound, index) => {
        // 替换成你需要的HTML结构,可使用i和index生成动态标识
        return `
        <div class="sound-item sound-${i}-${index}">
            <span>${sound}</span>
            <!-- 其他动态元素 -->
        </div>
        `;
    }).join('');

    controlDiv.innerHTML =  `
    <audio id="audio${i}" class="player${i}" src="audio/${defaultSounds[i]}.opus" loop></audio>

    <!-- 插入循环生成的HTML片段 -->
    ${soundsHTML}

    <div class="on-off-container">
        <button onclick="onOff('audio${i}', 'btn-icon${i}','displaySpan${i}','on-off${i}')" type="button" class="on-off-btn btn-inactive on-off${i}">
             <i class="fa-solid fa-power-off"></i>
        </button>
    </div>
    `;
    
    document.getElementById("control-grid").appendChild(controlDiv);
}

关键说明:

  • map替代forEach:forEach无返回值,无法生成HTML字符串;map会为每个数组元素返回对应HTML片段,再用join('')拼接成可嵌入模板的完整字符串。
  • 动态标识生成:map回调中可访问外层for循环的i和当前元素的index,用来生成唯一类名或ID。
  • 模板嵌入:通过${soundsHTML}将循环生成的HTML插入到主模板的对应位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:02:00