#javascript #html #css
Вопрос:
Абсолютный новичок в JavaScript здесь. Было бы здорово, если бы вы помогли мне разобраться в синтаксисе того, что я хочу сделать (чтобы улучшить его). Это простой MCQ. правильный ответ должен заставить кнопку стать зеленой, а в противном случае-красной.
document.addEventListener('DOMContentLoaded', function() {
// No idea how to get the id of a button you clicked so everything is hard-coded
document.querySelector('#england').onclick = function() {
document.querySelector("#england").style.backgroundColor = 'red';
};
document.querySelector('#spain').onclick = function() {
document.querySelector("#spain").style.backgroundColor = 'red';
};
document.querySelector('#italy').onclick = function() {
document.querySelector("#italy").style.backgroundColor = 'green';
};
});
^Это находится под <head> <script></script> </head>
блоком кода.
<h3>Which international football team won the 2020 UEFA European Football Championship (aka Euro 2020)?</h3>
<button id='england'>England</button>
<button id='spain'>Spain</button>
<button id='italy'>Italy</button>
^Это находится под <body></body>
блоком кода.
Так как же мне:
- Нажмите на любую из кнопок и получите идентификатор
- Проверьте, есть ли
id = #italy
—document.querySelector(" --insert the id here-- ").style.backgroundColor = 'green';
- Ещё,
document.querySelector(" --insert the id here-- ").style.backgroundColor = 'red';
Почему я не могу этого сделать?:
- Я думал об
var = id of button clicked
этой переменной и использовал ее, но я не знаю, как это сделать… Как вы пишете код, который знает, на какую кнопку нажимается? document.getElementById()
Помогло бы? Я вообще не знаю его применения.- Я могу предвидеть сценарий, при котором у меня будет более 3 кнопок, и выполнение подобных действий станет очень болезненным.
Пожалуйста, полегче со мной!
Комментарии:
1. Примечание к рекомендациям: весь код JavaScript, который взаимодействует с элементами DOM, должен располагаться в конце тела, прямо перед закрывающим тегом (
<body> ... <script> ... </script></body>
), а не в голове. Таким образом, вы уверены, что при выполнении кода JavaScript все элементы DOM были загружены.
Ответ №1:
Вы могли бы сделать что-то вроде:
// Select all buttons `.btnAnswer` and for each one...
document.querySelectorAll('.btnAnswer').forEach(btn => {
// ... add an event listener for the `click` event that...
btn.addEventListener('click', (event) => {
// ... retrieve the button ID and...
const btnId = btn.getAttribute('id');
// ... set the background color to green if thr ID is `italy` or to red otherwise
btn.style.backgroundColor = btnId === 'italy' ? 'green' : 'red';
})
});
<h3>Which international football team won the 2020 UEFA European Football Championship (aka Euro 2020)?</h3>
<button class="btnAnswer" id='england'>England</button>
<button class="btnAnswer" id='spain'>Spain</button>
<button class="btnAnswer" id='italy'>Italy</button>
В любом случае проблема с вашим подходом заключается в том, что код не может быть повторно использован, так как он зависит от идентификатора кнопки (который уникален); если у вас есть еще один вопрос с другими вариантами, вам придется написать довольно много повторяющейся логики.
Возможно, предпочтительным подходом может быть:
const correctAnswers = {
q1: 'italy',
q2: 'no',
q3: 'elizabeth'
};
// Select all questions and for each one...
document.querySelectorAll('.question').forEach(q => {
// ... fetch the correct answer for the question and...
const correctAnswer = correctAnswers[q.getAttribute('id')]
// ... select all the corresponding answer options, then...
q.querySelectorAll('.btnAnswer').forEach(btn => {
// ... add an event listener to the `click` event that...
btn.addEventListener('click', (event) => {
// ... retrieve the corresponding answer and...
const givenAnswer = btn.dataset.answer;
// ... set the background color to green if the answer is correct or to red if it is wrong
btn.style.backgroundColor = givenAnswer === correctAnswer ? 'green' : 'red';
})
})
});
<div class="question" id="q1">
<h3>Which international football team won the 2020 UEFA European Football Championship (aka Euro 2020)?</h3>
<button class="btnAnswer" data-answer='england'>England</button>
<button class="btnAnswer" data-answer='spain'>Spain</button>
<button class="btnAnswer" data-answer='italy'>Italy</button>
</div>
<div class="question" id="q2">
<h3>Can pinapple go on pizza?</h3>
<button class="btnAnswer" data-answer='yes'>Yes</button>
<button class="btnAnswer" data-answer='no'>No</button>
</div>
<div class="question" id="q3">
<h3>Who is the Queen of England?</h3>
<button class="btnAnswer" data-answer='elizabeth'>Elizabeth II</button>
<button class="btnAnswer" data-answer='elsa'>Elsa from Frozen</button>
</div>
Комментарии:
1. Ух ты! Большое спасибо за улучшения и предложения. Да, теперь я вижу, где я ошибся в логике. Ваш подход-это явное улучшение. Кроме того, я не знал о большей части используемого вами синтаксиса, но, прочитав документацию/посмотрев ее, я понял это сейчас. Спасибо, что пошли дальше, чтобы помочь мне! Я буду хорошо использовать ваши методы. 😀
Ответ №2:
document.querySelector('button').onclick = function() {
console.log(this.id);
}
Ты понял. Удалите все document.qwerySelector()
с помощью этой строки
Комментарии:
1. Спасибо, что ответили на мой вопрос! Это было не совсем то, что я искал, но я уверен, что когда-нибудь в будущем я это использую. 🙂
Ответ №3:
Следуйте приведенному ниже подходу.
- Выберите все узлы с
document.querySelectorAll('button')
- Добавьте
onclick
событие ко всем кнопкам. - Внутри события щелчка проверьте идентификатор цели и примените соответствующий стиль.
document.addEventListener('DOMContentLoaded', function () { document.querySelectorAll('button').forEach(node => node.onclick = function (event) { const nodeId = event.target.id; console.log('Clicked', nodeId); const bgColor = nodeId === 'italy' ? 'green' : 'red'; event.target.style.backgroundColor = bgColor; }) });
<h3>Which international football team won the 2020 UEFA European Football Championship (aka Euro 2020)?</h3> <button id='england'>England</button> <button id='spain'>Spain</button> <button id='italy'>Italy</button>
Комментарии:
1. @Noob_Coder_1132 Добро пожаловать, пожалуйста, утвердите мой ответ, если это вам помогло.