Увеличение кнопки HTML в JS

Я делаю 10 дней JS на Hackerrank, и я застрял на 9-м дне, когда вам нужно сделать кнопку, и при каждом нажатии она увеличивает число на кнопке на единицу. Я написал этот код, но похоже, что он ничего не делает. Кнопка выглядит нормально, но onclick не работает. Я также хочу сделать это, не записывая что-то вроде onclick = "increment ()" в html-коде, потому что я уже могу это сделать. Чтобы проверить свой код, я зашел на w3schools.com, нашел случайный тест и заменил код своим:

var btn = document.getElementById('btn');
var i = 0;

btn.onclick = function() {
  i++;
  btn.innerHTML = i;
};
.btnClass {
  width: 96px;
  height: 48px;
  font-size: 24px;
  background: #4FFF8F;
}
<h2>The Button Element</h2>
<button id = "btn" class = "btnClass">0</button>

Вам нужно переместить сценарий в нижнюю часть body или запустить его в обработчике «готовый документ». Проблема в том, что, поскольку сценарий находится в файле выше, чем там, где определена кнопка, он еще не существует в документе, когда сценарий анализирует и выполняет.

jmoerdyk 03.10.2018 23:05

Разве в консоли JavaScript не появляется ошибка? Это могло дать вам ключ к разгадке проблемы.

Barmar 03.10.2018 23:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
158
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Ваш JavaScript анализируется и выполняется до того, как ваша кнопка окажется на странице. Просто переместите свой скрипт ниже кнопки или прикрепите даже тот, который выполнит ваш код после загрузки страницы.

Ваш HTML и скрипт должны выглядеть так:

<!DOCTYPE html>
<html>
<style>
.btnClass {
    width: 96px;
    height: 48px;
    font-size: 24px;
    background: #4FFF8F;
}
</style>
<body>

<h2>The Button Element</h2>
<button id = "btn" class = "btnClass">0</button>
<script>

    var btn = document.getElementById('btn');
    var i = 0;

    btn.onclick = function () {
        i++;
        btn.innerHTML = i;
    };


</script>
</body>
</html>

Ух ты, ты спасатель, я мог бы поклясться, что пробовал это. Возможно, у меня были какие-то ошибки, которые я удалил, пытаясь решить проблему.

Sancho Jimenez 03.10.2018 23:10

Добро пожаловать, друг мой, это случается со всеми нами.

Senad Meškin 03.10.2018 23:11

Я смотрю по этой ссылке: https://www.w3schools.com/jsref/event_onclick.asp

Я думаю, что идентификатор внутри вашей кнопки должен быть событием onclick.

Надеюсь это поможет.

он уже использует событие onclick. пожалуйста, сначала прочтите код

Uğur Eren 03.10.2018 23:10

Ваш Javascript обрабатывался до ваш HTML был загружен в DOM (объектная модель документа) из-за того, что вы поместили свой JS перед своим HTML ...

Вы можете переключить это как ответ от Senad, однако ... более безопасный способ выполнить Javascript, который манипулирует DOM, - подождать, пока DOM не будет полностью загружен.

Ниже приведен код, который устраняет вашу проблему путем прослушивания события DOMContentLoaded и будет работать независимо от того, где вы загружаете свой Javascript.

document.addEventListener('DOMContentLoaded', function(){

console.info("DOM Loaded");

//Wait to add event listeners until the DOM is fully loaded. This is needed
// when wanting to access elements that are later in the HTML than the <script>.
  var btn = document.getElementById('btn');
  var i = 0;

  btn.addEventListener('click', function(el) {
      i++;
      btn.innerHTML = i;
      console.info("clicked")
  });

});

Если вы хотите сохранить свой JS в голове, вы также можете обернуть его в window.onload, чтобы все было в порядке.

<!DOCTYPE html>
<html>
<style>
.btnClass {
    width: 96px;
    height: 48px;
    font-size: 24px;
    background: #4FFF8F;
}
</style>

<script>
    window.onload = function() {    
        var btn = document.getElementById('btn');
        var i = 0;

        btn.onclick = function () {
            i++;
            btn.innerHTML = i;
        };
    }
</script>

<body>
<h2>The Button Element</h2>
<button id = "btn" class = "btnClass">0</button>
</body>
</html>

С window.onload ваш js "увидит" вашу кнопку, потому что страница полностью загружена.

Другие вопросы по теме