Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как оптимизировать загрузку и парсинг больших JS файлов со стороны браузера/клиента?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Совершенно непонятно, зачем на одной странице нужны 10 тыс фоток.
    Во-первых, столько физически не поместится даже на три-пять экранов.
    Во-вторых, человек в принципе не способен воспринимать такое количество информации одновременно.
    Скорее всего, мне думается, это просто лента фотографий, которая "бесконечно" прокручивается для просмотра.
    Вот из этого и нужно исходить.

    Сложить список файлов в базу данных.
    Загружать небольшое количество, ну скажем 50-100 изображений.
    По мере прокрутки страницы подгружать еще сотню следующих. Предыдущие удалять. При прокрутке в обратную сторону подгружать предыдущие, а ушедшие из зоны видимости удалять.
    И никакой нагрузки на браузер не будет, и визуально будет казаться, что все фото присутствуют на странице.
    Ответ написан
    1 комментарий
  • Как можно сократить этот код?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    const type_input = document.getElementById("type_input").value.toLowerCase();
    const type_names = ['фильм', 'сериал', 'мультсериал', 'мультфильм', 'аниме'];
    const type_index = type_names.indexOf(type_input);
    let type = 0;
    
    if (type_index === -1) {
        alert('Добавьте или исправьте тип');
    } else {
        type = type_index + 1; // значение для базы данных (если нужно 1-based)
    }
    Ответ написан
    4 комментария
  • Как реализовать запуск видео на сайте по клику видео YouTube/Vimeo на bootstrap?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    запрос к ИИ
    684a8caf7556e327947901.png

    Ответ:
    Вот готовое решение для открытия модального окна с YouTube видео по клику на кнопку:
    <button id="play" data-source="https://www.youtube.com/embed/dQw4w9WgXcQ">Play</button>
    
    <div id="modal" class="modal">
      <div class="modal-content">
        <span class="close">&times;</span>
        <iframe id="youtube-video" width="560" height="315" frameborder="0" allowfullscreen></iframe>
      </div>
    </div>
    
    <style>
      .modal {
        display: none;
        position: fixed;
        z-index: 1;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        background-color: rgba(0, 0, 0, 0.8);
      }
      
      .modal.show {
        display: flex;
        justify-content: center;
        align-items: center;
      }
      
      .modal-content {
        position: relative;
        background-color: #fefefe;
        padding: 20px;
        border-radius: 8px;
        max-width: 800px;
        width: 90%;
      }
      
      .close {
        position: absolute;
        top: 10px;
        right: 20px;
        font-size: 28px;
        font-weight: bold;
        color: #aaa;
        cursor: pointer;
      }
      
      .close:hover {
        color: #000;
      }
      
      iframe {
        width: 100%;
        aspect-ratio: 16/9;
      }
    </style>
    
    <script>
      const playButton = document.getElementById('play');
      const modal = document.getElementById('modal');
      const closeButton = document.querySelector('.close');
      const iframe = document.getElementById('youtube-video');
      
      playButton.addEventListener('click', () => {
        const videoUrl = playButton.getAttribute('data-source');
        iframe.src = videoUrl + '?autoplay=1';
        modal.classList.add('show');
      });
      
      closeButton.addEventListener('click', () => {
        modal.classList.remove('show');
        iframe.src = '';
      });
      
      // Закрытие модального окна при клике вне его
      window.addEventListener('click', (event) => {
        if (event.target === modal) {
          modal.classList.remove('show');
          iframe.src = '';
        }
      });
    </script>


    Этот код включает:

    1. Кнопку Play с атрибутом data-source, содержащим ссылку на YouTube видео
    2. Модальное окно с iframe для встраивания видео
    3. Стили для:
      • Затемненного фона
      • Центрированного модального окна
      • Кнопки закрытия
      • Адаптивного видео (сохраняет соотношение сторон 16:9)


    4. JavaScript для:
      • Открытия модального окна по клику
      • Вставки видео в iframe с автовоспроизведением
      • Закрытия модального окна
      • Остановки видео при закрытии




    Вы можете изменить ссылку в data-source на нужное вам YouTube видео. Для получения embed-ссылки на YouTube нажмите "Поделиться" → "Встроить" и скопируйте URL из атрибута src iframe.
    Ответ написан
    Комментировать
  • Как вычислить размер шрифта для блока div с заданным размером?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    велосипед не мой. вроде работает.

    Ответ написан
    1 комментарий
  • Почему не срабатывает удаление класса?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    <button class="btn-chapter" data-chapter="1">Глава 1</button>
    <button class="btn-chapter" data-chapter="2">Глава 2</button>
    <button class="btn-chapter" data-chapter="3">Глава 3</button>
    <button class="btn-chapter" data-chapter="4">Глава 4</button>
    <button class="btn-chapter" data-chapter="5">Глава 5</button>
    
    <div class="chapter" id="chapter-1"><h2>Глава 1: Основы Фотошопа - Растровая графика</h2></div>
    <div class="chapter" id="chapter-2"><h2>Глава 2: Основы Фотошопа - Растровая графика</h2></div>
    <div class="chapter" id="chapter-3"><h2>Глава 3: Основы Фотошопа - Растровая графика</h2></div>
    <div class="chapter" id="chapter-4"><h2>Глава 4: Основы Фотошопа - Растровая графика</h2></div>
    <div class="chapter" id="chapter-5"><h2>Глава 5: Основы Фотошопа - Растровая графика</h2></div>


    .chapter {
      display: none;
    }
    .chapter.is-open {
      display: block;
    }


    document.addEventListener('DOMContentLoaded', function() {
    
      const allChapters = document.querySelectorAll('.chapter');
    
      const closeAllChapters = () => allChapters.forEach(el => el.classList.remove('is-open'));
      const openChapterById = id => document.getElementById(id).classList.add('is-open');;
    
      document.querySelectorAll('.btn-chapter').forEach(btn => {
        btn.addEventListener('click', () => {
          closeAllChapters();
          openChapterById(`chapter-${btn.dataset.chapter}`);
        });
      });
    
    });
    Ответ написан
    Комментировать
  • Как по клику скопировать текст из div (не textarea) в textarea?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    <button data-id="XXX1" class="copy-button">Copy</button>
    <div id="XXX1"></div>
    <button data-id="XXX2" class="copy-button">Copy</button>
    <div id="XXX2"></div>
    <button data-id="XXX3" class="copy-button">Copy</button>
    <div id="XXX3"></div>
    
    <textarea id="textarea-el"></textarea>


    document.querySelectorAll('.copy-button').forEach(btn => {
      btn.addEventListener('click', () => {
        const id = btn.dataset.id;
        const text = document.getElementById(id).textContent;
      
        document.getElementById('textarea-el').value = text;
      });
    });
    Ответ написан
    5 комментариев
  • Как сделать что бы при увеличении высоты блока с помощью slideTogle одновременно плавно увеличивалась ширина блока?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Используйте метод .animate() и изменяйте любые параметры блока.
    Ответ написан
  • Как запретить оверлею загораживать отдельно взятый элемент? Как выбить/поднять/отменить дочерний элемент из контекста наложения?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Без костылей вряд ли получится.
    Но можно закостылить на css, без javascript

    overlay - z-index: 1;
    div - z-index: 2;

    то есть оверлей будет под блоком

    внутри дива свой отдельный оверлей и у кнопки z-index большего этого внутреннего оверлея.
    Ответ написан
  • Как для мобильных сделать правильную нумерацию?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Я бы повесил слушателя на смену слайда и скриптом навешивал цифры. У свайпера есть свойство содержащее реальный номер слайда без учета клонов (посмотрите в документации), от него и отталкивался бы.

    Альтернативно, можно пробежаться скриптом по слайдам до инициализации слайдера и проставить цифры. Это если количество слайдов фиксированное, и не меняется динамически.
    Ответ написан
  • Slick slider, как центрировать один слайд?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Обманите его. Просто расширьте видимую часть слайдера

    .my-slider
      .my-slider-clip
        .my-slider-container 
          .swiper


    .my-slider-clip { margin-inline: -50px; overflow: hidden; }
    .my-slider-container { padding-inline: 50px; }
    .ny-slider .swiper { overflow: visible; }

    D этом случае и centerMode не нужен. Просто один видимый слайд slidesToShow: 1;.
    Ответ написан
  • Как сделать звездный рейтинг?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Как много кода для простого рейтинга.

    Ответ написан
  • Как сделать прилипающую кнопку при клике на чекбокс?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Можно не вычислять положение, а чуть изменить принцип и верстку. Позиционировать кнопку с помощью CSS в отдельном контейнере, скриптом перемещать в нужный контейненр.

    <div class="filter-item">
      <input type="checkbox">
    </div>
    <div class="filter-item">
      <input type="checkbox">
    </div>
    <div class="filter-item">
      <input type="checkbox">
    </div>
    <button id="apply-button">показать</button>


    #apply-button {
      display: none;
    }
    
    .filter-item {
      position: relative;
    }
    .filter-item input:checked ~ #apply-button {
      display: block;
      position: absolute;
      left: 100%;
      top: 50%;
      transform: translateY(-50%);
    }


    const button = document.getElementById('apply-button');
    document.querySelectorAll('.filter-item').forEach(item => {
      const cb = item.querySelector('input[type=checked]');
      cb.addEventListener('change', () => {
        if (cb.checked) {
          item.appendChild(button);
        }
      })
    });
    Ответ написан
    Комментировать
  • Как приостановить setInterval на время и снова продолжить tampermonkey?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Останавливать всегда. Если условие не выполнилось, то снова запускать по таймауту 1000мс.
    Ну и если интервал будет срабатывать только один раз, то можно использовать таймаут

    let timerId;
    const timer = () => {
        const text = document.querySelector('.Tag-module_content__uLsTI').textContent
    
        if(text.slice(0, -1)<(-52)){
            // ...payload
            console.log('Сработало условие');
            // Сработало, больше не требуется
        }
        else{
            rel();
            // Не сработало, запускаем снова через секунду
            timerId = setTimeout(timer, 1000);
        }
    }
    
    timerId = setTimeout(timer, 150);
    Ответ написан
    Комментировать
  • Как сделать ширину блока по ширине контента?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    В общем случае – никак.
    Если использовать неразрывные пробелы между нужными словами (nbsp;) или переносы (br), то можно задать ширину как width: min-content или width: max-content. Но это частные случаи, не универсально.
    Ответ написан
  • Как отключить swiper-bundle.min.css?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    не подключайте, если он вам не нужен.

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

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    В нативном ничуть не сложнее https://developer.mozilla.org/ru/docs/Web/API/Elem...
    btn.addEventListener('click' e=>{
      const modal = e.target.closest('.modal[data-modal=cart]');
    });
    Ответ написан
    Комментировать
  • Порождается ли событие в элементе или оно само по себе?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Любое событие порождается на корневом элементе. потом оно погружается до целевого элемента, а затем всплывает обратного до корневого.
    Отловить событие на элементе (любом на пути) можно в любой фазе (погружение/всплытие).
    Вообще об этом на первой странице учебника по джаваскрипт пишут.

    Порождается ли событие в элементе

    Нет

    Порождается ли событие кликом по элементу или упрощенно самим элементом?

    Да. Но возникает оно на корневом элементе.
    Ответ написан
    Комментировать
  • Как исправить ошибку "Uncaught ReferenceError: $ is not defined" хотя jQuery подключен?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Порядок подключения скриптов имеет значение.
    Порядок загрузки скриптов тоже имеет значение.
    Ответ написан
    Комментировать
  • Как реализовать debounce для поля ввода, чтобы ограничить количество вызовов API в JavaScript?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    function debounce(func, delay) {
        let timeoutId;
        return function (...args) {
            clearTimeout(timeoutId);
            timeoutId = setTimeout(() => {
                func.apply(this, args);
            }, delay);
        };
    }
    
    input.addEventListener('input', debounce(e => {
        fetchSuggestions(e.target.value); // This is being called on every keystroke
    }, 100));
    Ответ написан
    Комментировать
  • Как создать слайдер крутящийся по кругу?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    В простейшем случае взять первый слайд и переставить его в конец, после чего осуществлять дальнейшую прокрутку. и так по кругу.
    Ответ написан
    Комментировать