最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

event.currentTarget.value returning undefined javascript - Stack Overflow

programmeradmin4浏览0评论

I'm trying to make a simple application where there is 1 global event listener listening for click events.

At the moment whenever I click on a button it returns undefined even though there is text in it (the buttons start off with no text but then gets filled in).

How would you be able to get the value of the button?


let currentQuestion = -1;


let questions = [
{
  question: "Question 1",
  options: {
    option1: "1",
    option2: "2",
    option3: "3"
  },
  correct: "1"
},
{
  question:"Question 2",
  options: {
    option1: "4",
    option2: "5",
    option3: "6"
  },
  correct: "5"
}
];

document.addEventListener("click", (event)=> {

  console.log(event.currentTarget.value);
  
  currentQuestion++;
  console.log(currentQuestion);

  document.querySelector("#opt1").innerHTML = questions[currentQuestion].options.option1;
  document.querySelector("#opt2").innerHTML = questions[currentQuestion].options.option2;document.querySelector("#opt3").innerHTML = questions[currentQuestion].options.option3;
  
});



      <button id="opt1"></button>
      <button id="opt2"></button>
      <button id="opt3"></button>
      <button id="next">Next</button>

I'm trying to make a simple application where there is 1 global event listener listening for click events.

At the moment whenever I click on a button it returns undefined even though there is text in it (the buttons start off with no text but then gets filled in).

How would you be able to get the value of the button?


let currentQuestion = -1;


let questions = [
{
  question: "Question 1",
  options: {
    option1: "1",
    option2: "2",
    option3: "3"
  },
  correct: "1"
},
{
  question:"Question 2",
  options: {
    option1: "4",
    option2: "5",
    option3: "6"
  },
  correct: "5"
}
];

document.addEventListener("click", (event)=> {

  console.log(event.currentTarget.value);
  
  currentQuestion++;
  console.log(currentQuestion);

  document.querySelector("#opt1").innerHTML = questions[currentQuestion].options.option1;
  document.querySelector("#opt2").innerHTML = questions[currentQuestion].options.option2;document.querySelector("#opt3").innerHTML = questions[currentQuestion].options.option3;
  
});



      <button id="opt1"></button>
      <button id="opt2"></button>
      <button id="opt3"></button>
      <button id="next">Next</button>
Share Improve this question edited Apr 14, 2023 at 9:32 Luke Girvin 13.4k10 gold badges67 silver badges85 bronze badges asked Jul 6, 2020 at 19:23 n212n212 6071 gold badge15 silver badges32 bronze badges 1
  • Do any of the answers work for you? – Unmitigated Commented Jul 7, 2020 at 3:58
Add a ment  | 

5 Answers 5

Reset to default 9

According to the mozilla docs: https://developer.mozilla/en-US/docs/Web/API/Event/currentTarget

The currentTarget read-only property of the Event interface identifies the current target for the event, as the event traverses the DOM. It always refers to the element to which the event handler has been attached, as opposed to Event.target, which identifies the element on which the event occurred and which may be its descendant.

your event handler is attached to document... which doesnt have a value.

try switching to event.target

console.log(event.target.value);

even then.. buttons dont have value... so you need to look at their innerText instead

console.log(event.target.innerText);

Button does not have a value property. Try innerText

Always add real snippets, it make it much easier to test and help with the code:

let currentQuestion = -1
let score = 0
let questions = [
  {
    question: "Question 1",
    answer: "opt2",
    options: {
      option1: "1",
      option2: "2",
      option3: "3",
    },
    correct: "1",
  },
  {
    question: "Question 2",
    answer: "opt3",
    options: {
      option1: "4",
      option2: "5",
      option3: "6",
    },
    correct: "5",
  },
]

document.addEventListener("click", (event) => {
  console.log("currentTarget:", event.currentTarget.id)
  // target works, but it only have an id
  const clickID = event.target.id
  console.log("clickID:", clickID)

  // consider using:
  if (questions[currentQuestion]) {
    console.log("anwser:",questions[currentQuestion].answer)
    if (clickID === questions[currentQuestion].answer) {
      score++
    }
    document.querySelector("#score").innerHTML = score
  }

  currentQuestion++
  console.log("currentQuestion:", currentQuestion)

  // Only use questions[currentQuestion] is exist!
  if (questions[currentQuestion]) {
    document.querySelector("#opt1").innerHTML =
      questions[currentQuestion].options.option1
    document.querySelector("#opt2").innerHTML =
      questions[currentQuestion].options.option2
    document.querySelector("#opt3").innerHTML =
      questions[currentQuestion].options.option3
  }
})
   <button id="opt1"></button>
    <button id="opt2"></button>
    <button id="opt3"></button>
    <button id="next">Next</button>
    <br/>
Score:        <div id="score">0</div>

event.currentTarget will always refer to the document itself, as you are handling the event at the document level. Use event.target instead to get the element from which the click event originated. Also, buttons do not have a value; you can use event.target.textContent to get its text.

let currentQuestion = -1;


let questions = [
{
  question: "Question 1",
  options: {
    option1: "1",
    option2: "2",
    option3: "3"
  },
  correct: "1"
},
{
  question:"Question 2",
  options: {
    option1: "4",
    option2: "5",
    option3: "6"
  },
  correct: "5"
}
];

document.addEventListener("click", (event)=> {
  console.log(event.target.textContent);
  
  currentQuestion++;
  console.log(currentQuestion);

  document.querySelector("#opt1").innerHTML = questions[currentQuestion].options.option1;
  document.querySelector("#opt2").innerHTML = questions[currentQuestion].options.option2;document.querySelector("#opt3").innerHTML = questions[currentQuestion].options.option3;
  
});
<button id="opt1"></button>
<button id="opt2"></button>
<button id="opt3"></button>
<button id="next">Next</button>

You can attach your eventListener to a ID or class.

For example to button with ID = NEXT.

document.getElementById("next").addEventListener("click", (event)=> {

  console.log(event.currentTarget.innerText); // Here you can work with any property
  
  currentQuestion++;
  console.log(currentQuestion);

  document.querySelector("#opt1").innerHTML = questions[currentQuestion].options.option1;
  document.querySelector("#opt2").innerHTML = questions[currentQuestion].options.option2;document.querySelector("#opt3").innerHTML = questions[currentQuestion].options.option3;
  
});

You can work with class too, with javascript

list = document.getElementsByClassName("className");
  for (var i = 0; i < list.length; i++) {
    list[i].addEventListener("click", function (e) {
        e.preventDefault();
    });
  }

You can achive same result with more friendly coding with jquery

发布评论

评论列表(0)

  1. 暂无评论