Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.09.2018, 16:39
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

Работа с navbar. active class link
Ребята, привет.
Пытаюсь сделать навигацию, с переключением активного класса, но немного застрял. Не работает переключение при использовании querySelectorAll. Возможно, при чтении материалов что-то упустил, но не пойму почему не срабатывает. Скрипт работает при querySelector, но только на первую ссылку, но мне нужны все. Поэтому этот вариант не подходит. Закомментированный скрипт тоже не годится, так как работает только с jq. Подскажите, что не так со скриптом?

<!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">
    <title>Document</title>
</head>

<body>
    <style>
        .navbar-nav {
            display: -ms-flexbox;
            display: flex;
            -ms-flex-direction: row;
            flex-direction: row;
            padding-left: 0;
            margin-bottom: 0;
            list-style: none;
        }

        .nav-link {
            position: relative;
            margin: 15px;
            text-decoration: none;
            padding-top: 10px;
            padding-bottom: 10px;
        }

        .nav-link::before,
        .nav-link::after {
            content: '';
            position: absolute;
            left: 0;
            width: 100%;
            height: 2px;
            background: #d94f5c;
            -webkit-transform: scale3d(0, 1, 1);
            transform: scale3d(0, 1, 1);
            -webkit-transition: -webkit-transform 0.2s;
            transition: transform 0.2s
        }

        .nav-link::before {
            top: 0;
            -webkit-transform-origin: 0 50%;
            transform-origin: 0 50%
        }

        .nav-link::after {
            bottom: 0;
            -webkit-transform-origin: 100% 50%;
            transform-origin: 100% 50%
        }

        .nav-link.active::before,
        .nav-link.active::after {
            -webkit-transform: scale3d(1, 1, 1);
            transform: scale3d(1, 1, 1);
            -webkit-transition-timing-function: cubic-bezier(0.22, 0.61, 0.36, 1);
            transition-timing-function: cubic-bezier(0.22, 0.61, 0.36, 1);
            -webkit-transition-duration: 0.4s;
            transition-duration: 0.4s
        }
    </style>
    <ul class="navbar-nav ml-auto mt-2 mt-lg-0">
        <li class="nav-item">
            <a class="nav-link active" href="#about">о нас</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="#testing">испытания</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="#reglaments">регламенты</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="#map">контакты</a>
        </li>
    </ul>

    <script>
        /* jquery
        $('.navbar-nav .nav-link').click(function() {
            $('.navbar-nav .nav-link').removeClass('active');
            $(this).addClass('active');
        })
        */

        let link = document.querySelectorAll('.nav-link');
        link.onclick = function () {
            this.classList.toggle('active');
        }
    </script>

</body>

</html>
Ответить с цитированием
  #2 (permalink)  
Старый 17.09.2018, 16:44
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

madeas,
Нужен цикл.
Ответить с цитированием
  #3 (permalink)  
Старый 17.09.2018, 16:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от madeas
link.onclick
такого нет в js
Ответить с цитированием
  #4 (permalink)  
Старый 17.09.2018, 17:26
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

рони,
как нет? а это? И скрипт же работает при querySelector
Ответить с цитированием
  #5 (permalink)  
Старый 17.09.2018, 17:31
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

madeas,
даже 2 цикла
var link = Array.from(document.querySelectorAll('.nav-link'));
        link.forEach(function(it) {
           it.onclick = function () {
              link.forEach(function(el) {
                 el.classList.remove('active');
              });
              this.classList.toggle('active');
           }
         });


обработчик навешивается на конкретный элемент DOM,
querySelector дает конкретный элемент, querySelectorAll - коллекцию элементов

jQuery умная - делает циклы скрытно.
Ответить с цитированием
  #6 (permalink)  
Старый 17.09.2018, 17:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Dilettante_Pro,
может 1 цикл и
var el = document.querySelector('.nav-link.active');
el && el != this && el.classList.remove('active');
this.classList.toggle('active');
Ответить с цитированием
  #7 (permalink)  
Старый 17.09.2018, 17:52
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

понял, потренируюсь. Спасибо.
Ответить с цитированием
  #8 (permalink)  
Старый 17.09.2018, 17:57
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

рони,
Я что-то не понял - где обработчик кликов для всех элементов .nav-link?
Снаружи? И внутри ищется один .active?
remove тогда можно и без проверок - все равно потом назначится на нужный
Ведь активный при повторном клике по нему же выключать не нужно?

Последний раз редактировалось Dilettante_Pro, 17.09.2018 в 18:03.
Ответить с цитированием
  #9 (permalink)  
Старый 17.09.2018, 17:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от Dilettante_Pro
где обработчик кликов для всех элементов .nav-link?
в строке 3 где и был
var link = Array.from(document.querySelectorAll('.nav-link'));
        link.forEach(function(it) {
           it.onclick = function () {
              

var el = document.querySelector('.nav-link.active'); 


el && el != it && el.classList.remove('active'); 


it.classList.toggle('active'); 
 
           }
         });
Ответить с цитированием
  #10 (permalink)  
Старый 18.09.2018, 09:04
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

Вот вроде смотрю на скрипт рони и казалось бы, ничего сложного... а сам бы не составил. Вечером пробовал составить аналог для скрипта копирования содержимого нескольких одноклассовых полей, но он не работает. Подскажите, что упустил?

let copy = Array.from(document.querySelectorAll('.copy'));
copy.forEach(function(teco) {
  teco.addEventListener('click',
    function(event) {
      let text = copy;
      text.select();
      document.execCommand('copy');
    });
});

Последний раз редактировалось madeas, 18.09.2018 в 09:18.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
active class porezon Общие вопросы Javascript 5 19.07.2016 09:52
Присвоить разные class элементу li, какаие есть способы? aleksandr8i Javascript под браузер 11 12.03.2015 23:46
Помогите разобраться с плагином link (tinymce) nkl jQuery 0 08.04.2014 13:25