添加下一个按钮以循环遍历javascript中的元素

Posted

技术标签:

【中文标题】添加下一个按钮以循环遍历javascript中的元素【英文标题】:Adding a next Button to loop through elements in javascript 【发布时间】:2021-08-18 01:33:34 【问题描述】:

我在 firestore 中有一些项目。我想按顺序显示它们,但要随机显示。所以,我做了以下代码。在这里,我想显示一个特定的问题,然后当单击“下一步”按钮时,我想显示下一个项目。在这里,在 forEach 循环中,我将项目呈现给 renderQuestion 函数。他们使用 html 和 CSS 在前端展示它们。

但我正在处理这个问题,他们一直显示所有内容,直到循环结束。他们不会等待“下一步”按钮被按下。那么,我该如何解决这个问题?我是JS新手,如果我已经做错了什么,请原谅我。

renderQuestion = (qID, roomID) => 
  q.innerHTML = qID.data().question;
  ans1.innerHTML = qID.data().a;
  ans2.innerHTML = qID.data().b;
  ans3.innerHTML = qID.data().c;
  ans4.innerHTML = qID.data().d;
  /* next.addEventListener("click", (e) =>  //not working
    e.preventDefault();
    console.log("done");
  ); */
;

runningExam = async (review) => 
  const totalQ = review.data().total_questions;
  let arr = [];
  for (let i = 0; i <= totalQ; i++) 
    arr.push(false);
  
  let n = totalQ;

  while (n) 
    let randomNumber = getRandom(totalQ);
    if (!arr[randomNumber]) 
      arr[randomNumber] = true;
      await db
        .collection("examrooms")
        .doc(review.id)
        .collection("questions")
        .where("serial", "==", randomNumber)
        .get()
        .then((snapshot) => 
          snapshot.docs.forEach((doc) => 
            renderQuestion(doc, review);
          );
        );
      n--;
    
  
;

【问题讨论】:

【参考方案1】:

您似乎正试图阻止runningExam 函数,直到用户按下按钮。我找到了另一个thread 来实现这一点。

基本上,将renderQuestion 函数转换为异步函数,并在每次调用时等待用户输入。

renderQuestion = async (qID, roomID) => 
  const timeout = async ms => new Promise(res => setTimeout(res, ms));
  let userClicked = false;

  q.innerHTML = qID.data().question;
  ans1.innerHTML = qID.data().a;
  ans2.innerHTML = qID.data().b;
  ans3.innerHTML = qID.data().c;
  ans4.innerHTML = qID.data().d;
  next.addEventListener("click", (e) => 
    userClicked = true;
    e.preventDefault();
    console.log("done");
  );
  
  while (userClicked === false) await timeout(50);
;

runningExam:

then( async (snapshot) => 
      for(let doc of snapshot.docs) 
        await renderQuestion(doc, review);
      ;
  );

可能有更好的方法来编写此任务,这只是按照您尝试的方式执行此操作的一种可能方法。

【讨论】:

不幸的是,这不起作用。它会一直显示所有项目,并且不会像以前那样等待“下一步”按钮:( 我的错,那是因为 forEach 不适用于 async/await。我更新了runningExam 函数来解决这个问题。 谢谢,它成功了。但是,我很想知道不等待与 forEach 合作? Here 是对 forEach 实际实现的源代码的解释。我也不是很明白,今天才学的:)

以上是关于添加下一个按钮以循环遍历javascript中的元素的主要内容,如果未能解决你的问题,请参考以下文章

在模态中的wordpress帖子中添加下一个和上一个按钮

在模式中添加下一个/上一个按钮

如何在 xcode 的 MPMoviePlayerController 中添加下一个/上一个按钮/控件?

如何在幻灯片中添加下一个/上一个按钮

如何在寻呼机设置 jqgrid 上添加下一个和上一个按钮

javascript 如果以前在mongoDb中失败,如何添加下一个文档?