Код VS: файл HTML не извлекает функции из прикрепленного javascript

Выполняю базовую практику/тестирование для проекта, над которым я работаю, и не могу получить доступ к своему html-файлу для доступа к функциям, написанным в прикрепленном файле javascript. Я чувствую, что есть что-то сверхъестественное, чего мне не хватает, но я не могу указать на это.

Базовую кнопку я вытащил отсюда: Создание кнопки ВКЛ/ВЫКЛ с помощью javascript И я пробовал решения здесь: Файл HTML не извлекает информацию из файла javascript

Мой HTML:

<!DOCTYPE html>
<head>
  <script type = "text/javascript" src = "app.js"></script>
  <link rel = "stylesheet" href = "style.css">
</head> 
<body>
    <input type = "button" value = "X" id = "turn" onclick = "turn();">
</body>
</html>

Мои JS:

function turn(){
    currentvalue = document.getElementById('turn').value;
    if (currentvalue == "X"){
        document.getElementById("turn").value = "O";
    }
    else{
        document.getElementById("turn").value = "X";
    }
}

Сама функция работает, когда она встроена в тег script внутри <body>, но не при извлечении из прикрепленного файла javascript. Что мне не хватает?

Ваш код запускается до загрузки DOM. Либо поместите вызов скрипта перед </body>или используйте отсрочку, либо window.addEventListener('DOMContentLoaded', fn);.

Andy 20.03.2022 02:07

@ Энди, но функция, скорее всего, не запустится до тех пор, пока документ не будет загружен, поскольку она запускается щелчком пользователя, поэтому к тому времени document должен был быть готов.

code 20.03.2022 02:13

@Энди Пробовал все три из них и, к сожалению, не сработал. Пробовал размещать скрипт прямо над <body>, сверху внутри него и внизу внутри него. Затем попробовал использовать defer в теге script, а также добавил window.addEventListener... etc в javascript, и все равно ничего.

Cameron Crane 20.03.2022 02:17

Не ответ на ваш вопрос, почему трижды попал в DOM? это может быть просто function turn() { let myTurn = document.getElementById('turn'); myTurn.value = myTurn.value == "X" ? "O" : "X"; }

Mark Schultheiss 20.03.2022 02:45
Поведение ключевого слова "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
4
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны использовать тег <script> в теле.

<!DOCTYPE html>
<html lang = "en">
  <head> </head>
  <body>
    <input type = "button" value = "X" id = "turn" onclick = "turn();" />
    <script src = "app.js"></script>
  </body>
</html>

Для резюме: современный подход к старому подходу

  • Вы можете использовать module, которые по умолчанию отмечены defer <script type = "module" src = "/app.js"></script>
  • Вы можете использовать defer, чтобы убедиться, что ваш js выполняется после загрузки страницы, т.е. <script src=app.js" defer></script>
  • Вы можете поставить свой тег <script> перед закрытием тега </body> body

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

К сожалению, пробовал и это, и все равно ничего :(

Cameron Crane 20.03.2022 02:18

Выше работает на моей машине.

Umut Gerçek 20.03.2022 02:26

После редактирования: Пробовал модуль изначально и, к сожалению, тоже не сработал. Ни отложить, ни изменить положение моего тега <script>.

Cameron Crane 20.03.2022 02:26

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

Umut Gerçek 20.03.2022 02:35

Похоже, проблема заключалась в том, что я случайно оставил строку window.addEventListener('DOMContentLoaded', fn); в своем javascript, одновременно пробуя этот метод, и это вызывало проблему. Удаление его и добавление defer в мой тег <script> каким-то образом исправило это. Спасибо!

Cameron Crane 20.03.2022 02:36
Ответ принят как подходящий

function turn(){
    currentvalue = document.getElementById('turn').value;
    if (currentvalue == "X"){
        document.getElementById("turn").value = "O";
    }
    else{
        document.getElementById("turn").value = "X";
    }
}
<!DOCTYPE html>
<head>
  <script type = "text/javascript" src = "app.js" defer></script>
  <link rel = "stylesheet" href = "style.css">
</head> 
<body>
    <input type = "button" value = "X" id = "turn" onclick = "turn();">
</body>
</html>

Вам нужно добавить атрибут отсрочки.

Это исправило это! Я пробовал это раньше, но случайно оставил window.addEventListener('DOMContentLoaded', fn); в своем javascript в то же время, и это каким-то образом вызывало проблему. Скопировал/вставил в точности ваш (без этого лишнего дополнения), и это как-то сработало. Спасибо за помощь :)

Cameron Crane 20.03.2022 02:35

Добро пожаловать. Defer заставляет его загружать js, но ждать завершения синтаксического анализа HTML. Затем проанализируйте файл js.

webCatDev 20.03.2022 02:45

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