Я делаю викторину и хочу узнать, на какую кнопку нажимают больше всего, чтобы дать ответ.
У меня эти переменные в начале установлены на ноль, и их баллы будут увеличиваться при вводе пользователем.
var earthScore = 0;
var venusScore = 0;
всякий раз, когда нажимается кнопка, запускается функция
q1a4.addEventListener ("click", earth);
q1a5.addEventListener ("click", venus);
эта функция добавит единицу к исходным переменным
function earth () {
earthScore += 1;
questionCount += 1;
}
function venus () {
venusScore += 1;
questionCount += 1;
}
теперь я хочу узнать переменную, которая имеет наибольшее количество кликов, и дать ответ пользователю, например; если переменная земли имеет больший балл, чем переменная венера, то я изменю результат на result.innerHTML = 'you are earth', но я не знаю, как найти переменную с наибольшим баллом
на самом деле это мой первый проект с использованием js, поэтому у меня не так много идей, и все, что я пытался найти, кажется неправильным, поэтому я был бы очень признателен, если бы кто-нибудь мог дать мне ответ для моей программы.
Отвечает ли это на ваш вопрос? Функция Javascript max() для 3 чисел
Давайте не будем так сильно минусовать новичков. Dua Diy явно пытался решить проблему и наткнулся на блокировщик. Все мы когда-то были новичками, не будем слишком строги.
@LajosArpad Согласен, я отформатировал его вопрос так, чтобы его могли понять другие пользователи.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Впоследствии вы можете поместить результаты в массив с помощью:
let tmpArray = [];
tmpArray.push(earth);
tmpArray.push(venus);
tmpArray.sort(function(a, b){return b - a});
Теперь у вас есть самое высокое значение в:
tmpArray[0];
См.: https://www.w3schools.com/js/js_array_sort.asp
Не проще ли просто вызвать Math.max(earth, venus)?
Все способы работают. Это ответ для кодирования. Это не способ "почему" - это способ "как". В моем примере я подумал сделать систему показателей или что-то подобное.
Сначала посмотрите на решение:
var earthScore = 0;
var venusScore = 0;
var questionCount = 0;
function handleResult() {
if (earthScore !== venusScore) result.innerText = "you are " + ((earthScore >= venusScore) ? "earth" : "venus");
else result.innerText = "";
}
function earth () { earthScore += 1; questionCount += 1; handleResult(); }
function venus () { venusScore += 1; questionCount += 1; handleResult(); }
let q1a4 = document.getElementById("q1a4");
let q1a5 = document.getElementById("q1a5");
q1a4.addEventListener ("click", earth); q1a5.addEventListener ("click", venus);
let result = document.getElementById("result");<input type = "button" id = "q1a4" value = "EARTH">
<input type = "button" id = "q1a5" value = "VENUS">
<div id = "result"></div>Объяснение:
handleResult, который обновит результат с текущим победителем (или ничего, если у нас ничья)earth и venus, как вы изначально определили, за исключением вызова handleResult также для обработки результатаclick события для кнопок, как вы указалиРЕДАКТИРОВАТЬ
Давайте посмотрим на пример с 8 элементами, что случайно соответствует количеству планет в Солнечной системе (бедный Плутон)
function handleResult() {
let tie = false;
let maxSoFar = 0;
let plnt = "";
for (let planet of Object.keys(counts)) {
if (counts[planet] > maxSoFar) {
maxSoFar = counts[planet];
tie = false;
plnt = planet;
} else if (counts[planet] === maxSoFar) {
tie = true;
}
}
if (tie) {
result.innerText = ""; //a tie
} else {
result.innerText = "You are " + plnt.toLowerCase();
}
}
let result = document.getElementById("result");
let planets = document.getElementsByClassName("planet");
let counts = {};
for (let planet of planets) {
counts[planet.value] = 0;
planet.addEventListener("click", function() {
counts[this.value]++;
handleResult();
});
}<input type = "button" class = "planet" value = "MERCURY">
<input type = "button" class = "planet" value = "VENUS">
<input type = "button" class = "planet" value = "EARTH">
<input type = "button" class = "planet" value = "MARS">
<input type = "button" class = "planet" value = "JUPITER">
<input type = "button" class = "planet" value = "SATURN">
<input type = "button" class = "planet" value = "URANUS">
<input type = "button" class = "planet" value = "NEPTUNUS">
<div id = "result"></div>Объяснение:
handleResult теперь извлекает ключи объекта counts (которые являются именами планет), повторяет их и сравнивает их количество с максимальным на данный момент; если больше, то это точно не ничья, а новый максимум и эти значения сохраняются; в противном случае, если счет текущей планеты равен самому высокому счету на данный момент, то у нас ничья (пока); наконец, если текущий счетчик меньше максимального на данный момент, то мы ничего не делаем и позволяем циклу пройти через элементresult точно так же, как и раньшеcounts как пустой объектplanetscounts, имеющего значение 0, например, counts["MERCURY"] в начале равно 0handleResultUncaught SyntaxError: Идентификатор «результат» уже объявлен script.js: 97 js: 97, это строка [let result = document.getElementById ("result");]
@duadiy эта ошибка говорит вам, что у вас уже была переменная result, и она дублируется. Пожалуйста, попробуйте фрагмент, который я предоставил в своем ответе, нажав «Выполнить фрагмент кода» и дайте мне знать, работает ли он для вас. Если это так, то проблема просто в том, что вы вставили этот код в файл(ы), который у вас уже есть, и некоторые переменные дублируются.
Я вижу, что за этот ответ проголосовали против. Я не понимаю, почему за это проголосовали бы даже после повторного прочтения, поскольку мне это кажется правильным. Если бы были добавлены некоторые предложения относительно того, какие недостатки можно найти в этом ответе, они помогли бы мне их улучшить. Спасибо!
Я исправил ошибку, и программа работает отлично благодаря вам. У меня также есть вопрос: могу ли я добавить больше переменных и использовать тот же формат, что и выше, чтобы найти наибольшую оценку из 8 переменных? Еще раз спасибо за помощь, я ценю это :)
Я не знаю, почему за ваш комментарий проголосовали против, потому что я этого не делал, и когда я пытаюсь проголосовать за него, он говорит, что мне нужно больше очков репутации, чтобы проголосовать.
@duadiy да, вы также можете применить его с восемью переменными. Позвольте мне отредактировать мой ответ с помощью примера примера.
@duadiy реализовал его для 8 планет. Я знаю, что вы не проголосовали против. stackoverflow позволит вам голосовать только тогда, когда вы наберете 25 баллов. Но я не знаю, почему за этот ответ проголосовали, потому что он кажется мне правильным. Я полагаю, голосующему против не понравился тот факт, что я ответил на вопрос новичка. Если это так, то я не согласен с отрицательным голосованием, потому что, по моему мнению, сама причина существования этого сайта заключается в том, чтобы убедиться, что платформу можно использовать для запросов и получения технической помощи, в том числе для новичков. Все когда-то были новичками, но некоторые забыли об этом.
@duadiy Как ни странно, другой ответ, который не дает полного ответа и чрезмерно усложняет частичный ответ, к которому он обращается, всю мысль можно было бы выполнить с помощью Math.max(earth, venus) (при условии, что earth и venus были правильно инициализированы) вместо создания массива, помещения в него двух значений и сортировки.
я понимаю ваш ответ 8 планет, но дело в том, что в моей программе кнопки id = q1a1, q1a2 и т. д. и. значение - это имя, такое как красный, желтый и т. д., которое затем соответствует такой планете var q1a1 = document.getElementById ("q1a1");. q1a1.addEventListener ("click", mars);
Я как бы делаю викторину в стиле BuzzFeed, где пользователь дает ответ на случайные вопросы, которые затем соответствуют планете. Для простоты я добавил 8 вариантов ответа на каждый вопрос, чтобы каждый ответ был связан с планетой, и у меня также есть 9 вопросов, поэтому независимо от того, какой результат не может быть равным
Я попытался добавить эту функцию, но дело в том, что если я выбираю 2 планеты поочередно (Земля и Венера), то earthScore = 4 , venusScore = 5, но поскольку цикл проверяет только большее, чем 2, он останавливает цикл и дает ответ «Земля-задница», даже если Венера правильная, и я не могу сделать больше 4, потому что если пользователь выбирает каждую планету в каждом вопросе, то в вопросе 9 только одна из планет будет иметь оценку 2, и у меня не будет ответа. function updateResult() { if (earthScore >= 2) { result.innerHTML = 'you are earth'} else if (venusScore > 2) { result.innerHTML = "you are venus"
спасибо за помощь и извините за беспокойство, но я все еще новичок в старшей школе, и я люблю делать викторины BuzzFeed, поэтому я подумал, что сделаю один. Я смотрю курс, но в нем всего 3 вопроса, и, поскольку я интересуюсь астрономией, я думал, что сделаю один из планет, но я не знал, насколько это будет сложнее, чем викторина из 3 вопросов и 2 вариантов ответа.
@duadiy, тогда вы можете искать свои элементы как document.querySelectorAll("#q1a1,#q1a2,#q1a3,#q1a4,#q1a5,#q1a6,#q1a7,#q1a8") Я рекомендую добавить класс к вашим элементам, чтобы сделать его более универсальным. Представьте, что у вас есть 200 предметов. Или 2000. Также я бы не стал создавать функцию для каждого элемента. Представьте, что у вас есть 10000 элементов. Будет ли возможно иметь 10000 отдельных функций или лучше иметь очень мало функций, охватывающих обобщенный шаблон? Конечно, это последнее. Вот почему я создал переменную counts и добавил в нее ключи, чтобы можно было повторно использовать один и тот же шаблон...
@duadiy ... для каждого элемента. Мой второй код Javascript будет работать, даже если у вас будет 200 или 20000 или любое другое количество планет. Это важный урок программирования. Вам нужно, чтобы ваш код был как можно более независимым от ввода, именно так вы можете написать мощный код. Ничья может быть даже при 9 вопросах. Представьте себе случай, когда Земля и Венера выбирались 4-4 раза, а Уран - 1 раз. В этом случае была бы связь между Землей и Венерой. Возможным решением для разрыва некоторых ничьих было бы наличие дополнительного бонусного вопроса, который отображается только в случае ничьей.
@duadiy, и можно будет выбрать только варианты связанных планет. Итак, если есть связь между Землей и Венерой, то вы показываете дополнительный вопрос, и отображаются только варианты Земли и Венеры. Возможно, вы захотите задать новый вопрос с вашим текущим кодом. Кажется, это новая проблема для решения, которая выходит за рамки комментария. В новом вопросе поделитесь своим точным кодом в виде фрагмента, где проблема может быть воспроизведена, и сообщите мне здесь, в разделе комментариев. Пожалуйста, не беспокойтесь о том, чтобы задавать вопросы. я рад помочь
@duadiy причина, по которой 3 элемента сложнее, чем два, заключается в том, что в конкретном случае, когда у вас есть только два элемента, вы можете просто сравнить их, тогда как в случае 3 вам нужно найти максимум. К счастью, это несложный паттерн, так что, если вы уже в нем разбираетесь, вы можете его обобщить.
я добавил планету класса к каждой кнопке, но теперь кнопки не работают, так как функции не определены, и я не понимаю документ. запрос, потому что я думаю, вы сказали добавить его, если у меня нет классовой планеты, но теперь у меня есть
@duadiy, пожалуйста, создайте новый вопрос с вашим текущим кодом и напишите здесь комментарий. Это позволит мне помочь вам. Какое имя класса вы добавили? Если это planet, то document.getElementsByClassName("planet") должно давать эти элементы.
Давайте продолжим обсуждение в чате.
Пожалуйста, предоставьте свой код в виде одного блока кода и включите вашу попытку заставить его работать. Также включите HTML.