简体   繁体   English

无法将事件侦听器添加到 API 中的元素

[英]Can't add an event listener to an element from an API

I am building a trivia webapp using an API and i want to add an event listener to the button with the correct answer so that when the user clicks it it will display a message saying they're right and it'll get a new question.我正在使用 API 构建一个琐事网络应用程序,我想向按钮添加一个事件侦听器并提供正确的答案,这样当用户单击它时,它会显示一条消息,说他们是对的,它会得到一个新问题。 Here's how the code looks:代码如下所示:

function useApiData(triviaObj) {
  let answers = sortArrayRandomly([
    triviaObj.results[0].correct_answer,
    triviaObj.results[0].incorrect_answers[0],
    triviaObj.results[0].incorrect_answers[1],
    triviaObj.results[0].incorrect_answers[2],
  ]);

  document.querySelector("#category").innerHTML = `Category: ${triviaObj.results[0].category}`;
  document.querySelector("#difficulty").innerHTML = `Difficulty: ${triviaObj.results[0].difficulty}`;
  document.querySelector("#question").innerHTML = `Question: ${triviaObj.results[0].question}`;

  document.querySelector("#answer1").innerHTML = `${answers[0]}`;
  document.querySelector("#answer2").innerHTML = `${answers[1]}`;
  document.querySelector("#answer3").innerHTML = `${answers[2]}`;
  document.querySelector("#answer4").innerHTML = `${answers[3]}`;

  let rightAnswer = triviaObj.results[0].correct_answer;
  rightAnswer.addEventListener("click", correctAnswer);

  console.log(answers);
}

function correctAnswer() {
  alert("correct");
  getTrivia();
}

It tells me that the AddEventListener is not a function, how can I fix this?它告诉我 AddEventListener 不是 function,我该如何解决这个问题?

Event listeners go on DOM elements, not on pieces of data or other variables.事件侦听器 go 在 DOM 元素上,而不是在数据片段或其他变量上。 Try finding the correct answer element and attaching the event listener to that:尝试找到正确的答案元素并将事件侦听器附加到该元素:

const rightAnswer = triviaObj.results[0].correct_answer;
const matchingAnswer = answers.find((x) => x === rightAnswer);
const rightElement = Array.from(document.querySelectorAll('*[id^="answer"]'))
  .find((el) => el.innerText.includes(rightAnswer))
rightElement.addEventListener("click", correctAnswer);

Use a loop to fill in the answer elements.使用循环填充答案元素。 In that loop you can check if the current answer is the correct answer and add the event listener.在该循环中,您可以检查当前答案是否为正确答案并添加事件侦听器。

 answers.forEach((answer, i) => { let button = document.querySelector(`#answer${i+1}`); button.innerHTML = answer; if (answer == triviaObj.results[0].correct_answer) { button.addEventListener("click", correctAnswer); } else { button.removeEventListener("click", correctAnswer); } });

Assuming that triviaObj.results[0].correct_answer is a number representing the correct answer, then:假设triviaObj.results[0].correct_answer是一个代表正确答案的数字,那么:

Replace代替

let rightAnswer = triviaObj.results[0].correct_answer;

with

let rightAnswer = document.querySelector(`#answer${triviaObj.results[0].correct_answer}`);

This is much more simple than Zan Anger's solution.这比赞怒的解决方案简单多了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM