JavaScript модальный не открывается на всех страницах - PullRequest
0 голосов
/ 16 января 2019

Я создал JavaScript-модал, который открывается по клику, он изолирован в одном файле, и я хочу повторно использовать его на других страницах, он отлично работает на странице index.html, но когда я хочу использовать его на другой странице, он дает me Cannot read property 'addEventListener' of null Я попытался обернуть мой модальный код js в window.onload = function () {}, потому что я полагал, что DOM не был загружен полностью, но опять же он не работал, как я могу заставить его работать на каждой странице

вот содержимое index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link rel="stylesheet" type="text/css" href="./css/main.css">
  <link rel="stylesheet" type="text/css" href="./css/modal.css">
  <title>Word Spelling Game</title>
</head>
<body>
  <div class="menu">
      <audio controls autoplay loop>
          <source src="./sounds/menu-song.mp3" type="audio/mp3">
          Your browser does not support the audio element.
        </audio>
    <a href="./pages/game-menu.html">
      <img src="./images/choose-game-sign.png" class="board"> 
    </a>
    <div>
    <img src="./images/help-sign.png" class="board trigger">
    <div class="modal">
        <div class="modal-content">
            <span class="close-button">&times;</span>
           <h1>Welcome!</h1>
           <article>
             This is a collection of interactive games designed for children, each game
             aims to further develop the childs skill set in a variety of tasks that involve
             spelling, writing and simple math. It is designed in a fun way so that your kid will never become bored!
             There are different levels of difficulty for different ages. To select and play
             a level click on the Choose level tab above this one. You can see each game's rules
             by clicking on the rules tab that is located on the right corner on each level. The instructions are written in 
             a way that every kid can understand in case that he get's stuck at some point.
           </article>
        </div>
    </div>
    </div>
  </div>
  <script src="./scripts/help-modal.js"></script>
</body>
</html>

Другая страница, на которой я хочу использовать ее, которую пользователь открывает после того, как щелкнет ссылку «Выбрать игру»:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link rel="stylesheet" href="../css//game-menu.css">
  <link rel="stylesheet" type="text/css" href="../css/modal.css">
  <script src="../scripts/help-modal.js"></script>
  <title>Levels</title>
</head>
<body>
  <a href="../index.html">
  <img src="../images/back-sign.png">
  </a>
  <div class="help">
      <p class="question-mark">?</p>
      <div class="modal">
          <div class="modal-content">
              <span class="close-button">&times;</span>
             <h1>Welcome!</h1>
             <article>
               This is a collection of interactive games designed for children, each game
               aims to further develop the childs skill set in a variety of tasks that involve
               spelling, writing and simple math. It is designed in a fun way so that your kid will never become bored!
               There are different levels of difficulty for different ages. To select and play
               a level click on the Choose level tab above this one. You can see each game's rules
               by clicking on the rules tab that is located on the right corner on each level. The instructions are written in 
               a way that every kid can understand in case that he get's stuck at some point.
             </article>
          </div>
      </div>
    </div>
</body>
</html>

и мой файл help-modal.js:

var modal = document.querySelector(".modal");
    var trigger = document.querySelector(".trigger");
    var closeButton = document.querySelector(".close-button");

    function toggleModal() {
        modal.classList.toggle("show-modal");
    }

    function windowOnClick(event) {
        if (event.target === modal) {
            toggleModal();
        }
    }

    trigger.addEventListener("click", toggleModal);
    closeButton.addEventListener("click", toggleModal);
    window.addEventListener("click", windowOnClick);

Ответы [ 2 ]

0 голосов
/ 16 января 2019

В вашем втором HTML-файле, похоже, нет элемента с классом trigger. Это причина вашей ошибки в консоли.

Включение ваших файлов JavaScript в конце body (как вы это делали в intex.html) также является хорошей практикой, чтобы убедиться, что JavaScript будет работать после загрузки всех элементов HTML.

0 голосов
/ 16 января 2019

1) На «другой» странице переместите тег <script> в конец разметки, как на странице «индекса», или добавьте оболочку window.onload = function() {} вокруг кода в файле .js. .

Причина в том, что в данный момент на «другой» странице скрипт загружается первым. Когда это загружается, это немедленно выполнено браузером. Так что сразу запускается var modal = document.querySelector(".modal");. Однако, поскольку скрипт был загружен до какого-либо HTML-кода в <body>, нет доступных элементов, соответствующих селектору .modal. Таким образом, ничего не выбрано, и, следовательно, слушатели событий не привязаны ни к какому элементу, и поэтому никогда не запускаются.

2) Кроме того, ваша «другая» страница не содержит элементов с классом «триггер». Таким образом, даже после того, как вы исправите проблему с загрузкой, строка var trigger = document.querySelector(".trigger"); все равно ничего не выберет, и вы все равно получите похожую ошибку, когда попытаетесь прикрепить обработчик события ни к чему. Так что вам тоже нужно это исправить. (Именно поэтому ваша предыдущая попытка window.onload = function() {} не удалась).

В итоге - элементы HTML, на которые вы нацеливаетесь, должны существовать до того, как будет выполнен JavaScript, который вы используете для их нацеливания.

...