Расширяемые вкладки JavaScript открываются при загрузке страницы... нужно, чтобы они были закрыты

У меня есть скрипт, который показывает список вкладок/кнопок. При нажатии на вкладку она разворачивается (отображается больше содержимого) и справа отображается изображение. Если щелкнуть другую вкладку, новая вкладка развернется, а другая закроется.

У меня возникла проблема с закрытием всех вкладок, когда пользователь переходит на эту страницу, но я хочу, чтобы все вкладки закрывались ТОЛЬКО в том случае, если JavaScript видит родительский тег div с определенным классом (т. е. если div с классом tabsleft-container имеет другой класс называется firsttabopen).

Я установил условие в конце JavaScript..., чтобы проверить, существует ли класс (проверяет div с помощью tabsleft-container, чтобы узнать, существует ли класс firsttabopen). Если класс irsttabopen существует, он должен запустить последнюю строку changeTab (открывающую первую вкладку)... но если класс не существует, все вкладки должны быть закрыты при загрузке страницы. Однако условие не работает. Предполагается, что класс firsttabopen существует и всегда выполняет строку changeTab...

Примечание. Для этого JavaScript написал кто-то другой, и мои знания JavaScript очень ограничены.

JavaScript находится здесь:

$(document).ready(function () {
  const firstmenucontents = $(".tabsleft-container");

  firstmenucontents.each((index, firstmenucontent) => {
    const copy = $(firstmenucontent).find(".bannerpane img").clone();
    copy.css("visibility", "hidden");
    $(firstmenucontent).find(".bannerpane-container").append(copy);

    let selecteditem = 0;

    let textpaneItemIndex = -1;
    const changeTab = (index, item) => {
      var delay = 300;

      if (window.innerWidth < 980) {
        delay = 800;
      }
      if (textpaneItemIndex !== index) {
        if (textpaneItemIndex !== -1) {
          $(firstmenucontent)
            .find(".textpane-item-container")
            .eq(textpaneItemIndex)
            .children(".textpane-subitem")
            .slideUp(delay);
          $(firstmenucontent)
            .find(".textpane-item-container")
            .eq(textpaneItemIndex)
            .removeClass("clicked");
          $(firstmenucontent)
            .find(".textpane-item-container")
            .eq(textpaneItemIndex)
            .children(".textpane-item")
            .children("img")
            .css("transform", "");
          $(firstmenucontent)
            .find(".bannerpane")
            .eq(textpaneItemIndex)
            .removeClass("bannerpane-animation");
        }
        $(firstmenucontent)
          .find(item)
          .children(".textpane-subitem")
          .slideDown(delay);
        $(firstmenucontent).find(item).addClass("clicked");
        $(firstmenucontent)
          .find(".bannerpane")
          .eq(index)
          .addClass("bannerpane-animation");
        textpaneItemIndex = index;

        $(firstmenucontent)
          .find(item)
          .children(".textpane-item")
          .children("img")
          .css("transform", "rotate(-180deg)"); // Corrected typo herea
      }
    };
    $(firstmenucontent)
      .find(".textpane-item-container")
      .each((index, item) => {
        $(firstmenucontent)
          .find(item)
          .click(() => {
            changeTab(index, item);
            selecteditem = index;
          });
      });

        if ($(firstmenucontents).hasClass('firsttabopen')) {
    changeTab(0, $(firstmenucontent).find(".textpane-item-container").eq(0));
}
  });
});

Итак, я изменил classList на hasClass... и это работает... ОДНАКО, если есть два экземпляра tabsleft-container... и только один содержит класс firsttabopen... тогда он запускает приведенный выше код, и первая вкладка расширяется на всех наборах этого кода (он видит один экземпляр и запускает его на всех). Мне нужен код для запуска changeTab только на ДЕТЯХ элемента div, у которого есть класс firsttabopen. Итак, я попробовал следующее...

   if ($(firstmenucontents).hasClass('firsttabopen')) {
        changeTab(0, $(firstmenucontent).find(".firsttabopen")
                  .children("textpane-item-container").eq(0));
    }

Я полагал, что как только он найдет элемент, у которого есть firsttabopen... он найдет firsttabopen, получит дочерний элемент textpane-item-container и затем откроет его (eq(0)).

Но это не работает.

Вот ссылка на полный код в CodePen: https://codepen.io/jabbmonkey/pen/eYoXJao

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

David 14.06.2024 21:59

Однако... Удалите последний вызов changeTab в конце.

David 14.06.2024 21:59

Я добавил свой код в вопрос. Удаление последней вкладки изменений работает... но не позволяет мне легко включать и выключать ее (желательно, добавив где-нибудь класс)

Jabbamonkey 14.06.2024 22:33

И когда вы пытаетесь создать запланированную функциональность, что вы пытаетесь сделать, а что не работает должным образом?

David 15.06.2024 14:53

Я не очень хорошо знаю JavaScript... Я предполагаю, что мне нужно добавить класс к одному из тегов div верхнего уровня... затем с помощью JavaScript сказать: "Эй, если этот тег существует, запустите код 'changeTab' ". Если этого не произойдет... ничего не делайте (и он останется закрытым). Но я не знаю, как это сделать...

Jabbamonkey 15.06.2024 15:27

Тогда может показаться, что вашим следующим шагом будет начать с некоторых руководств по JavaScript и попытаться начать создавать свою функциональность. Например, если вы хотите проверить, существует ли элемент на странице, это конкретная операция, которую вы можете найти и попытаться записать.

David 15.06.2024 19:54

Я просмотрел несколько руководств. Я добавил условие в конце скрипта... но оно все равно не работает. Вот почему я здесь.

Jabbamonkey 16.06.2024 13:34

Теперь, когда вы делаете попытку... Если вы не знакомы с инструментами разработки/отладки вашего браузера, сейчас самое время начать. Если добавленный вами оператор if вообще вызывается, я ожидаю, что он выдаст ошибку. Вы пытаетесь использовать свойство classList, которого нет в объекте jQuery. Вместо этого вы можете искать .hasClass() . См. этот вопрос об использовании jQuery для проверки того, имеет ли элемент (или набор элементов) определенный класс.

David 16.06.2024 15:21

hasClass работает, но проблема все еще существует. если есть два экземпляра tabsleft-container... и только один содержит класс "firsttabopen"... тогда он запускает ChangeTab во всех экземплярах. Итак, я попробовал запустить ChangeTab, используя .children(''), но это не сработало....

Jabbamonkey 16.06.2024 18:54

Ладно, я понял. На этот раз это была опечатка...

Jabbamonkey 17.06.2024 14:16
Поведение ключевого слова "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
10
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первым исправлением было использование .hasClass вместо .classList.

Тогда это была простая проблема с опечаткой....

if ($(firstmenucontents)...

изменился на...

if ($(firstmenucontent)

Вот и все. Все исправлено.

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