Выполняем реальный проект на JavaScript | ч.2 - Табы

แชร์
ฝัง
  • เผยแพร่เมื่อ 12 ม.ค. 2025

ความคิดเห็น • 27

  • @iventeye
    @iventeye 5 ปีที่แล้ว +20

    Очень круто, что вы делаете такие ролики по JS, т.к на ютубе мало таких уроков, либо они уже устаревшие. С вами очень приятно изучать JavaScript. Спасибо!

    • @VSsoviet
      @VSsoviet 4 ปีที่แล้ว +1

      основы не могут быть устаревшими

  • @Zibinskiy
    @Zibinskiy 5 ปีที่แล้ว +9

    Как всегда, на высоте ))). Спасибо за труды, Иван! )))

  • @viper_vlad
    @viper_vlad 4 ปีที่แล้ว +17

    Использовать classList.contains() для проверки на соответствие элемента по селектору как-то странно. Потому что аргумент функции задан как tabSelector, а селектор, все-таки, это не просто точка и название класса. Селектором может быть ID, может быть класс, может быть тэг, а может быть все вместе. Ты сам передаешь в качестве contentSelector составной селектор. А теперь представь, что сторонний программист будет работать над твоим кодом и, увидев в подсказке название аргумента + увидев, что ты в схожий аргумент передаешь составной селектор, сделает тоже самое и для селектора таба. И что тогда получится? Ошибка. Поэтому нужно либо менять аргумент на tabClassName, либо для проверки использовать не classList.contains(), а функцию matches().
    Здесь же идет проверка на соответствие родительского элемента. Только есть одно НО - твоя проверка учитывает вложенность не более одного уровня. То есть если внутри таба будет див, а внутри этого дива будет другой див, то клик по последнему диву не будет вызывать никаких действий, т.к. его родительский элемент не содержит класс, который должен содержать таб. Вместо этого тебе нужно использовать функцию closest(), которая перебирает все родительские элементы и проверяет их на переданный тобой селектор
    Регулярка, кстати, не нужна здесь. Есть более простая реализация в виде ф-ции substring. В нее просто передаешь единицу и получаешь ту же самую строку без точки вначале

    • @viper_vlad
      @viper_vlad 4 ปีที่แล้ว +7

      Забыл добавить насчет бесполезности регулярки. Регулярки используют либо если у тебя идет глобальная замена в строке, либо если какая-та сложная замена, где действительно без регулярки никак. Поиск точки ни к одному, ни к другому варианту не относится. Тебе просто можно написать replace(".", "")

    • @НикитаШевченко-ы8я
      @НикитаШевченко-ы8я 2 ปีที่แล้ว +4

      Спасибо за комментарий, интересно было прочитать!

  • @РоманВаськов-ф1х
    @РоманВаськов-ф1х 5 ปีที่แล้ว +2

    Мне новичку самое то что нужно для практики. Спасибо, Иван.

  • @МарияВасиленко-я5к
    @МарияВасиленко-я5к 4 ปีที่แล้ว

    Спасибо за урок! Чет только запуталась какие именно классы в функцию закидывать. Надо потом еще пересмотреть)

  • @paul_brain
    @paul_brain 4 ปีที่แล้ว +1

    Однозначно лайк! Благодарю за видео! :)

  • @videorock_ai
    @videorock_ai 5 ปีที่แล้ว +1

    Круто!Спасибо , с нетерпением жду следующую часть

  • @АлександрБашлачев-р7е
    @АлександрБашлачев-р7е 4 ปีที่แล้ว

    Спасибо! Очень полезный контент!

  • @АлексейБалакирев-ю5о
    @АлексейБалакирев-ю5о 4 ปีที่แล้ว +1

    в 1-ом табе class active добавляется к блоку ,на который ни как не влияет..там его надо к ссылке добавлять внутри блока это в тз нарисовано

  • @SR-gc8yk
    @SR-gc8yk 3 ปีที่แล้ว

    Спасибо

  • @alexcherepanov6152
    @alexcherepanov6152 4 ปีที่แล้ว +1

    сложновато, но универсально

  • @Dima25493
    @Dima25493 4 ปีที่แล้ว

    не могу понять почему не работает анимация на сайте? через нпм установили же jquery, animate css подключен и классы все прописаны, но не работает. подключив вручную jquery и wow js все заработало, думал что установлю wow js через npm и будет ок, но увы все также без движения

  • @ЛеонидБорисов-ч5х
    @ЛеонидБорисов-ч5х 4 ปีที่แล้ว

    Спасибо огромное, если можно вопрос, зачем блок с отделкой балкона делать слайдером, нельзя просто с помощью якорных ссылок сделать или это типа понты, что мы тоже классно вестаем

    • @awenn2015
      @awenn2015 4 ปีที่แล้ว

      Потому что лучше выглядит

  • @maxzhukov5525
    @maxzhukov5525 4 ปีที่แล้ว +3

    Знаешь в чем минус, ты не проверяешь по ходу все ли работает, а проверяешь только в конце и если смотреть, то потом в конце приходится искать в куче строк где же ошибка

  • @serhiigerkhard6745
    @serhiigerkhard6745 4 ปีที่แล้ว

    Спасибо за урок! Универсальные решения - просто огонь! Не понял только почему мы в main.js передаем аргументы для табов, почему не сделали по аналогии с модальными в самой функции tabs? И подскажи плиз по поводу проверки на наличие самого target в обработчике события, что это могут быть за элементы, которые не поддерживают события клика - конкретный пример?

    • @campfireschool
      @campfireschool  4 ปีที่แล้ว +2

      Как и говорил в уроке - можно спрятать во внутрь функционал, а можно вынести наружу. В модалках было много действий внутри модуля - и я их спрятал, в табах - только одно.
      Классический пример - тэг )

  • @fedy_2358
    @fedy_2358 4 ปีที่แล้ว

    Зачем так напрягаться?
    1. target.classList.contains(tabSelector.replace(/\./, '')) === target.matches(tabSelector)
    2. tab.forEach((item, i) => {
    if (target == item || target.parentNode == item) {
    hideTabContent();
    showTabContent(i);
    }
    })
    ===
    hideTabContent();
    showTabContent(Array.from(tab).findIndex(el => target === el || target.parentNode === el))

  • @olegplahotniy7307
    @olegplahotniy7307 4 ปีที่แล้ว

    А зачем все это писать вручную когда есть Бутстрап?

    • @bissm4rk4
      @bissm4rk4 2 ปีที่แล้ว

      ну как бы там написано в тз что на нативном писать нужно