当前位置: 首页 > 知识库问答 >
问题:

添加一个next按钮来循环javascript中的元素

葛雨华
2023-03-14

我在firestore有一些东西。我想按顺序显示它们,但以随机序列显示。所以,我做了以下代码。这里我想显示一个特定的问题,然后当点击“下一步”按钮时,我想显示下一个项目。在这里,在forEach循环中,我将项目渲染到renderQuestion函数。他们正在使用HTML和CSS在前端显示它们。

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

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个答案

薛征
2023-03-14

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

基本上,将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);
};

运行考试中

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

可能有更好的方法来编程这项任务,这只是一个可能的方法来做它的方式,你试图。

 类似资料:
  • 我有一个HTML格式的表,显示关于产品的数据。好吧,在这个表中我想添加一个按钮,允许用户在愿意的情况下删除该产品,该按钮将通过JavaScript与表中的信息一起自动生成。 没有信息的表应该如下所示: 在JavaScript中,我有一个函数可以处理这个表,一个用来添加空行,另一个用来添加信息,包括delete按钮。 其余的代码没有太大的关系,以至于有变量和函数的名字,我没有给出细节。对我来说最重要

  • 问题内容: Javascript中的“ for…in”循环是否按声明的顺序遍历哈希表/元素?有没有按顺序执行的浏览器? 我希望使用的对象将被声明 一次, 并且永远不会被修改。 假设我有: 我进一步将它们用于: 我是否可以期望在大多数体面的浏览器中,“ A:“ Hello””总是排在“ B:“ World””之前? 问题答案: 当前,所有主流浏览器都按照定义它们的顺序遍历对象的属性。Chrome可以

  • 有人能帮忙吗?我正在尝试获取代表动态生成的智能卡(例如633597015500042010)的按钮的最后一个xpath元素,然后单击它。我尝试了以下方法,但仍然找不到解决方法。我打算捕获的按钮的名称是“Select”。 driver.findElement(by.xpath(“//div[@class='select-item']/div)[last()]”).click();

  • 我的问题得到了回答,我的问题得到了解决。我已经更新了这个线程与我的最终解决方案 我正在做这个学校作业(测验程序),我们最初只需要做一个纯粹的基于文本的控制台游戏,但我想挑战自己,试着用JavaFX创建它,我们刚刚开始学习。 这是一个基于回合的问答游戏,玩家将被呈现一个问题,要求玩家通过两个按钮(对或错按钮)回答对/错 游戏流程: 我正在运行一个for循环,只要我的ArrayList中还有问题,这个

  • 问题内容: 我想在循环内添加延迟/睡眠: 我这样尝试过: 只有第一种情况是正确的:显示后,它将等待3秒钟,然后显示,但随后将不断重复。 我想要的是在显示3秒之后显示出来,然后它需要第二次等待3秒,依此类推。 问题答案: 该函数是非阻塞的,将立即返回。因此,您的循环将非常快速地迭代,并且将快速连续地发起3秒超时触发。这就是为什么您的第一个警报会在3秒钟后弹出,而其余所有警报都将连续不断地出现。 您可

  • 问题内容: 我的网站上有一个jqgrid(版本3.5.3),它是通过对Web服务的Ajax调用获取结果的。查询通常很复杂,加载结果需要花费几秒钟的时间。加载时,用户会看到一个框[Loading …]。 如果用户意识到他们在搜索错误的内容,则客户端要求向网格添加一个取消按钮,这将: 使网格忘记刚刚请求的数据 保留先前搜索中已加载的结果 似乎没有内置任何功能,因此我可能正在寻找一些技巧来实现这一目标。