堕天ニコニ 2021-08-14 16:56 采纳率: 33.3%
浏览 74
已结题

如何在forEach中为所有数据(数组)创建他们自己的ElementId?

在JavaScript中编写HTML时,由于要从一个网站上fetch数据从而使用了forEach,但是要处理数据时却发现,相同的Id只能使用一次,下面的代码在执行change()函数时innerHTML只认准最终的赋值。如果我想在forEach中为所有用户(students)创建他们自己的elementId,该怎么做?还是说forEach这个思路根本上就不对?

async function GET() {
    let url = 'https://api.hatchways.io/assessment/students';
    try {
        let res = await fetch(url);
        return await res.json();





    } catch (error) {
        console.log(error);
    }
}

function average(nums) {
    let gradeSum = 0;
    const len = nums.length;
    for (let i = 0; i < len; i++) {
        gradeSum = parseFloat(nums[i]) + gradeSum;
    }

function change(){
    if (cc==0){
        cc=1;
        document.getElementById(Id)="-";
    }
    else{
        cc=0;
        document.getElement0ById(Id)="+";
    }
}

async function renderstudents() {
    let S_user = await GET();
    let html = '';
    
    html += `<form action="" method="search_name">
                <input type="text" name="fname" style='width:432px;margin-left:20px;;padding:15px;background-color: rgb(255, 255, 255);border: 0px;' placeholder="Search by name"> 
             </form><HR align=center SIZE=1>`;
    html += `<form action="" method="search_tag">
                <input type="text" name="tag" style='width:432px;margin-left:20px;padding:15px;background-color: rgb(255, 255, 255);border: 0px;' placeholder="Search by tag"> 
             </form>`;
    S_user.students.forEach((student) => {
        Id = student.firstName+student.lastName;
        let htmlSegment1 = `<div class="user">
                            <HR align=center color=#000000 SIZE=2>
                            <img style="background-color: rgb(0,200,255);box-shadow: 2px 4px 5px;" src="${student.pic}" >
                            <h2>${student.firstName}&nbsp;${student.lastName}</h2>
                            <div class="others"><a href="email:&nbsp;${student.email}">${student.email}</a></div>
                            <div class="others">Company:&nbsp;${student.company}</div>
                            <div class="others">Skill:&nbsp;${student.skill.replace(/\s/g,'&nbsp;')}</div>`
                            
        let htmlSegment2 =  `<div class="others">Average&nbsp;Grade:&nbsp;${average(student.grades)}</a><button id="${student.firstName+student.lastName}" onclick="change()">+</button></div>
                            <br />`

        

        let htmlTag=`<form action="" method="adding_tag">
                                    <input type="text" name="add_tag" style='width:60px;padding:15px;margin:center;background-color: rgb(255, 255, 255);' placeholder="Enter Tag"> 
                                </form>
                            </div>`;
        let htmlGrade = '<div1>';
        for(let i=0;i<student.grades.length;i++){
            htmlGrade += 'Test' + parseFloat(i+1) + ':&nbsp;' + student.grades[i] + '%' + '<br />';
        }
        html += htmlSegment1;
        html += htmlSegment2;
        html += htmlGrade+'</div1>';
        html += htmlTag;
        console.log(Id);
    });

    let container = document.querySelector(".container");
      container.addEventListener("wheel", (event) => {
        event.preventDefault();
        container.scrollTop += event.deltaY;
      });
    container.innerHTML = html;
}

renderstudents();




  • 写回答

5条回答 默认 最新

  • 关注

    页面元素的id应该是唯一的,id不要重复,重复的id用document.getElementById()或jquery的$("#id") 获取时,只能获取到第一个。
    要获取多个元素时,应该用元素的class,并用getElementsByClassName()或jquery的$(".class")获取。
    如果你一定要用id的话,也可以用 document.querySelectorAll("#id") 获取多个元素。


    不用id, change(this) 传参this

    <button id="${student.firstName+student.lastName}" onclick="change(this)">+</button>
    

    change()函数改成

    function change(t){
        if (t.innerHTML=="+"){
            t.innerHTML="-";
        }
        else{
            t.innerHTML="+";
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 8月22日
  • 已采纳回答 8月14日
  • 赞助了问题酬金 8月14日
  • 创建了问题 8月14日

悬赏问题

  • ¥15 对于这个复杂问题的解释说明
  • ¥50 三种调度算法报错 采用的你的方案
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败