Ответы пользователя по тегу JavaScript
  • E.target видит лишь малую область блока?

    Клик может происходить на вложенные элементы внутри .accordion__item-title, и эти вложенные элементы становятся e.target.
    Попробуй использовать метод closest(), который проверяет родительские элементы вплоть до указанного селектора.

    accordion.addEventListener('click', function (e) {
        let target = e.target.closest('.accordion__item-title');
        if (target) {
            console.log('click');
            const content = target.nextElementSibling; 
            if (content.style.display === 'none') {
                content.style.display = 'block';
            } else {
                content.style.display = 'none';
            }
        }
    });
    Ответ написан
    Комментировать
  • Fetch дает ошибку?

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

    const url = 'https://cors-anywhere.herokuapp.com/http://www.jsonkeeper.com/b/MU1J';
    Ответ написан
    Комментировать
  • Где можно увидеть реализацию такого эффекта при скролле?

    Пару лет назад видел подобную идею, но с прорисовкой подписи человека по скроллу, выглядело достаточно свежо и я тогда пытался разобраться с реализацией. Прямо сходу не вспомню всех нюансов, но тебе точно нужна динамическая прорисовка SVG.
    Изучи свойства stroke-dasharray и stroke-dashoffset.
    Сначала через svg отрисовываешь нужные линии, а уже JS прорисовывает их в зависимости от процента скролла:
    const progress = Math.min(scrollPosition / (documentHeight - windowHeight), 1);
          line.style.strokeDashoffset = totalLength * (1 - progress);
        };
    Ответ написан
    Комментировать
  • Почему слайдер на базе Swiper с видео YouTube в iframe не двигается при свайпе?

    iframe {
      pointer-events: none;
    }
    Ответ написан
    Комментировать
  • Как сгруппировать значения массива?

    const array = ['part1-item1', 'part1-item2', 'part2-item1', 'part3-item1'];
    
    const result = array.reduce((acc, rec) => {
      const [devId, paramId] = rec.split('-');
      if (!acc[devId]) {
        acc[devId] = [paramId]; 
      } else {
        acc[devId].push(paramId); 
      }
      return acc;
    }, {});
    console.log(result);
    Ответ написан
    Комментировать
  • Как сделать пагинацию на js для нескольких независимых секций на странице?

    Здравствуйте. Здесь нужно бы обрабатывать каждую секцию отдельно, используя отдельный массив элементов для каждой, а потом генерировать независимые контролы пагинации для каждой секции.

    <div class="wrap_item" data-section="1">
      <h3 class="title_heading">Секция №1</h3>
      <div class="wrap_elements">
        <div class="class_element">Элемент 1</div>
        <div class="class_element">Элемент 2</div>
        <div class="class_element">Элемент 3</div>
        <div class="class_element">Элемент 4</div>
        <div class="class_element">Элемент 5</div>
      </div>
      <div class="pagination"></div>
    </div>
    
    <div class="wrap_item" data-section="2">
      <h3 class="title_heading">Секция №2</h3>
      <div class="wrap_elements">
        <div class="class_element">Элемент A</div>
        <div class="class_element">Элемент B</div>
        <div class="class_element">Элемент C</div>
        <div class="class_element">Элемент D</div>
        <div class="class_element">Элемент E</div>
      </div>
      <div class="pagination"></div>
    </div>
    
    <div class="wrap_item" data-section="3">
      <h3 class="title_heading">Секция №3</h3>
      <div class="wrap_elements">
        <div class="class_element">Элемент α</div>
        <div class="class_element">Элемент β</div>
        <div class="class_element">Элемент γ</div>
        <div class="class_element">Элемент δ</div>
        <div class="class_element">Элемент ε</div>
      </div>
      <div class="pagination"></div>
    </div>


    document.addEventListener('DOMContentLoaded', () => {
    
        const itemsPerPage = 2;
    
        document.querySelectorAll('.wrap_item').forEach((section) => {
          const wrapElements = section.querySelector('.wrap_elements');
          const elements = Array.from(wrapElements.children);
          const paginationContainer = section.querySelector('.pagination');
          const totalPages = Math.ceil(elements.length / itemsPerPage);
    
          function showPage(page) {
            elements.forEach((el, index) => {
              el.style.display =
                index >= (page - 1) * itemsPerPage && index < page * itemsPerPage
                  ? ''
                  : 'none';
            });
          }
    
          function createPagination() {
            paginationContainer.innerHTML = ''; // очистили контейнер пагинации
            for (let i = 1; i <= totalPages; i++) {
              const button = document.createElement('button');
              button.textContent = i;
              button.addEventListener('click', () => {
                showPage(i);
                updateActiveButton(i);
              });
              paginationContainer.appendChild(button);
            }
            updateActiveButton(1); 
          }
    
          function updateActiveButton(activePage) {
            paginationContainer.querySelectorAll('button').forEach((btn, index) => {
              btn.classList.toggle('active', index + 1 === activePage);
            });
          }
    
          showPage(1);
          createPagination();
        });
      });


    .wrap_elements {
        display: flex;
        flex-wrap: wrap;
        gap: 10px;
      }
    
      .class_element {
        padding: 10px;
        border: 1px solid #ccc;
        background: #f5f5f5;
      }
    
      .pagination button {
        margin: 0 5px;
        padding: 5px 10px;
        border: none;
        background: #ddd;
        cursor: pointer;
      }
    
      .pagination button.active {
        background: #ff6f61;
        color: #fff;
      }


    Теперь имеем что? Каждый .wrap_item обрабатывается отдельно, кайф. Все дочерние элементы .class_element собираются в массив, ну красота. Style.display для скрытия/показа элементов в зависимости от текущей страницы.
    Количество кнопок определяется totalPages.
    При клике на кнопку отображаются элементы, соответствующие выбранной странице. Вроде ничего не упустил.
    Ответ написан
    1 комментарий
  • Как исправить скрипт tampermonkey, чтобы при открытии новой вкладки собирать данные?

    function visitLinksSequentially(links) {
        let index = 0;
    
        function waitForPageLoad(newTab, callback) {
            // ждем полную загрузку
            newTab.addEventListener('load', function onLoad() {
                newTab.removeEventListener('load', onLoad); 
                callback(); 
            });
        }
    
        function extractData(newTab, callback) {
            // логика для извлечения данных
            const extractedData = newTab.document.querySelectorAll('SELECTOR_YOUR_DATA'); 
            console.log('Извлечённые данные:', extractedData); 
            callback(); 
        }
    
        function visitNextLink() {
            if (index < links.length) {
                const link = links[index];
                index++;
                const newTab = window.open(); // открыли новую вкладку
    
                newTab.location.href = link;
    
                waitForPageLoad(newTab, () => {
                    setTimeout(() => {
                        extractData(newTab, () => {
                            newTab.close(); // закрыли
                            visitNextLink(); // пошли дальше
                        });
                    }, 1000); 
                });
            } else {
                console.log('Good job bro!');
            }
        }
    
        visitNextLink();
    }
    Ответ написан
    Комментировать
  • Как добавить параметры стиля и другие атрибуты в ячейку DataTables в режиме server-side?

    можно передать кастомизированные данные с сервера и затем настроить таблицу на клиентской стороне с использованием createdRow и render
    Ответ написан
    Комментировать
  • В чём ошибка js?

    Добрый день.
    В функции calculateBMI у вас используется document.querySelector(".height").value и document.querySelector(".weight").value для получения значений роста и веса, но поля ввода на самом деле имеют классы .input_height и .input_weight. Из-за этого высота и вес всегда остаются undefined.

    Условия проверки (height === "" || isNaN(height)) и (weight === "" || isNaN(weight)) не сработают корректно, потому что height и weight уже будут числами или NaN. Проверка height === "" бессмысленна после преобразования parseInt.

    Ну и про обратные кавычки уже упомянули, тоже акутально.

    <div class="header">
            <h1 class="bmi_calc">Калькулятор ИМТ</h1>
            <h4>Рост</h4>
            <input class="input_height" type="text" placeholder="Введите рост (см)">
            <h4>Вес</h4>
            <input class="input_weight" type="text" placeholder="Введите вес (кг)">
            <p>
                <button class="button" type="button">Рассчитать</button>
            </p>
            <div class="result"></div>
        </div>


    window.onload = () => {
                const button = document.querySelector(".button");
                button.addEventListener("click", calculateBMI);
            }
    
            function calculateBMI() {
                const height = parseInt(document.querySelector(".input_height").value);
                const weight = parseInt(document.querySelector(".input_weight").value);
                const result = document.querySelector(".result");
    
                if (isNaN(height) || height <= 0) {
                    result.innerHTML = "Укажите реальный рост";
                } else if (isNaN(weight) || weight <= 0) {
                    result.innerHTML = "Укажите реальный вес";
                } else {
                    const bmi = (weight / ((height * height) / 10000)).toFixed(2);
    
                    if (bmi < 18.6) {
                        result.innerHTML = `Низкий вес: <span>${bmi}</span>`;
                    } else if (bmi >= 18.6 && bmi < 24.9) {
                        result.innerHTML = `Нормальный вес: <span>${bmi}</span>`;
                    } else {
                        result.innerHTML = `Избыточный вес: <span>${bmi}</span>`;
                    }
                }
            }


    Я не проверял, но по идее больше косяков нет, должно работать
    Ответ написан
    Комментировать