querySelectorВсе с функцией forEach не работает для кнопки переключения на слайдах карусели - PullRequest
1 голос
/ 09 марта 2019

Я создал шаблонную часть в PHP, которая копирует кнопку на каждый слайд в карусели, используя fullpage.js. У части шаблона есть скрытый элемент div, который должен открывать навигацию для каждого слайда. Используя приведенный ниже код, я могу заставить эту кнопку работать только на первом слайде. Я думаю, что повторное имя класса может помочь, но не уверен, почему querySelectorAll не сделает это. Любой совет приветствуется ...

http://www.pulsecreative -clients.com / постановка / хогсхед / # гольф

    const clickOnMe = document.querySelectorAll(".course-button");

    let clickOnMe = document.querySelectorAll(".course-button"); 
    Array.from(clickOnMe).forEach(el => {
        el.addEventListener("click", e => { 
            let showBox = e.currentTarget.nextElementSibling;
            showBox.classList.toggle("open-nav"); 
        }); 
    });
.subnav-content {
    position: fixed;
    bottom: 15%;
    z-index: 1;
    box-sizing: border-box;
    padding: 10px;
    background-color: #000;
    display: none;
}

.golfcoursebutton {
    box-sizing: content-box;
    min-width: 30px;
    height: 30px;
    padding: 4px;
    margin: 4px;
    background-color: #fff;
    color: #000; 
    text-align: center;
}

.open-nav {
    display: block;
}
<div id="jump-button" class="jumpbuttons-container">
    <div class="subnav">
        <button class="course-button">
            JUMP TO <i class="fa fa-angle-up"></i>
        </button>
        <div class="subnav-content">
            <div style="display: flex;">
                <div class="golfcoursebutton"><a href="#golf/1">1</a></div>
                <div class="golfcoursebutton"><a href="#golf/2">2</a></div>
                <div class="golfcoursebutton"><a href="#golf/3">3</a></div>
                <div class="golfcoursebutton"><a href="#golf/4">4</a></div>
                <div class="golfcoursebutton"><a href="#golf/5">5</a></div>
                <div class="golfcoursebutton"><a href="#golf/6">6</a></div>
            </div>

            <div style="display: flex;">
                <div class="golfcoursebutton"><a href="#golf/7">7</a></div>
                <div class="golfcoursebutton"><a href="#golf/8">8</a></div>
                <div class="golfcoursebutton"><a href="#golf/9">9</a></div>
                <div class="golfcoursebutton"><a href="#golf/10">10</a></div>
                <div class="golfcoursebutton"><a href="#golf/11">11</a></div>
                <div class="golfcoursebutton"><a href="#golf/12">12</a></div>
            </div>

            <div style="display: flex;">
                <div class="golfcoursebutton"><a href="#golf/13">13</a></div>
                <div class="golfcoursebutton"><a href="#golf/14">14</a></div>
                <div class="golfcoursebutton"><a href="#golf/15">15</a></div>
                <div class="golfcoursebutton"><a href="#golf/16">16</a></div>
                <div class="golfcoursebutton"><a href="#golf/17">17</a></div>
                <div class="golfcoursebutton"><a href="#golf/18">18</a></div>
            </div>
        </div>
    </div>
</div>

EDIT ОБНОВЛЕНО РЕШЕНИЕМ

Ответы [ 4 ]

2 голосов
/ 09 марта 2019

Вы выбираете первый документ

document.querySelector(".subnav-content");

, когда он должен быть первым элементом

e.querySelector(".subnav-content");
2 голосов
/ 09 марта 2019

querySelectorAll не возвращает массив, поэтому он не имеет forEach.К счастью, вы можете легко создать из него массив с помощью Array.from:

// change this
clickOnMe.forEach(...
// to this
Array.from(clickOnMe).forEach(...
1 голос
/ 09 марта 2019

Я создал шаблонную часть в PHP, которая копирует кнопку на каждый слайд в карусели, используя fullpage.js.

К сожалению, повторное использование вашего кода приводит к ошибке. Если мы посмотрим на ваш источник, мы увидим:

div.jump-button
    button.course-button
    div.subnav-content

<script>
    const clickOnMe = ...
</script>

Это повторяется ~ 20 раз.

Проблема в том, что const может быть объявлен только один раз. После этого JS выдаст ошибку. На самом деле, если мы посмотрим на консоль, мы увидим только это:

enter image description here

Как правило, после первого объявления const clickOnMe возникает ошибка. Вот почему работает только первый. Я бы посмотрел на перемещение (и консолидацию) <script>, где вы определяете clickOnMe вниз, и вызывал бы это, как только весь HTML загружен.

Edit:

Что касается вашего комментария, я понимаю, что вы имеете в виду. Теперь вы правильно запрашиваете все элементы, перемещая привязку события внизу (потрясающе!), Но ваш слушатель события также должен быть обновлен. На изменение на самом деле отвечают здесь (by @ jeyko-caicedo) путем ссылки на объект event при переключении classList.

Более полным ответом будет то, что вам нужно сослаться на объект события (для ссылки на элемент, по которому щелкнули), а затем запросить брата subnav-content. Одним из способов является то, что предложил Jeyko (закрытие forEach). Другой - в обработчике событий: 1: переход по дереву DOM (с использованием e.currentTarget.parentNode) или 2: просто ссылка на элемент напрямую, например e.currentTarget.nextElementSibling.

let clickOnMe = document.querySelectorAll(".course-button"); 
Array.from(clickOnMe).forEach(function(el) { // updated `e` to `el`
    el.addEventListener("click", (e) => { 
        let showBox = e.currentTarget.nextElementSibling;
        showBox.classList.toggle("open-nav"); 
    }); 
});
1 голос
/ 09 марта 2019

querySelectorAll возвращает NodeList. По сути, это просто массив узлов DOM, но он не поддерживает все методы Array, которые вы ожидаете получить. Сначала вам нужно будет привести его к массиву или вручную для его зацикливания вместо использования forEach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...