Ответы пользователя по тегу JavaScript
  • Как скрыть форму на js?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Добавьте стили display: none для формы:
    Ответ написан
    Комментировать
  • Как вернуться на первый шаг в форме?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    // Функция для переключения на определенную вкладку
    function toTab(n) {
      // Проверяем, является ли индекс n отрицательным
      if (n < 0) {
        return;
      }
    
      var x = document.getElementsByClassName("tab");
    
      // Проверяем, не превышает ли индекс n количество вкладок
      if (n >= x.length) {
        return;
      }
    
      // Скрыть текущую вкладку:
      x[currentTab].style.display = "none";
      // Устанавливаем новую текущую вкладку
      currentTab = n;
      // Отображаем нужную вкладку:
      showTab(n);
    }


    <button type="button" id="nextBtn" onclick="toTab(0)">Вернуться к первому шагу</button>
    Ответ написан
    2 комментария
  • Как понять что скрипт перестал работать после того как развернули браузер?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Я запутался в том, что хочу сделать.

    Одному вам известно, что у вас на уме

    но знаю что setTimeout работает криво,

    Современные браузеры снижают частоту таймеров, чтобы сэкономить ресурсы. Поэтому и "криво" работает как вам кажется. Аналогично "криво" будет работать любой требующий ресурсов код - WebSocker и тд.

    накапливается или вовсе перестает работать

    Это проблемы у вас в коде

    Как мне перезапускать скрипт после развертывания браузера телефона

    0. Вынесите реализацию подключения к websocket'у в отдельную функцию и проверяйте состояние соединения перед каждым действием:
    let socket;
    const url = "ws://your-websocket-server-url";
    
    function connect() {
      socket = new WebSocket(url);
      socket.onopen = () => {};
      socket.onmessage = (event) => {};
      socket.onerror = (error) => {};
      socket.onclose = (event) => {};
    }
    
    function reconnect() {
      if (socket && socket.readyState !== WebSocket.CLOSED) return;
      .....
    }
    
    function send(message) {
      if (socket && socket.readyState === WebSocket.OPEN) {
        socket.send(message);
        return
      }
      console.warn("WebSocket is not open. Message not sent:", message);
      ....
    }

    1. Отправляйте переодически ping сообщение для проверки состояния соединения. Если нет ответа, переподключаемся (и проверяем состояние соединения перед переподключением).
    2. Добавьте слушатель visibilitychange для отслеживания "развертывания" вкладки:
    document.addEventListener('visibilitychange', () => {
        // document.hidden
        if (document.visibilityState === 'visible' && websocket.readyState === WebSocket.CLOSED) {
            reconnect();
        }
    });


    ps забыл упомянуть про PushAPI если необходимо получать сообщения в фоновом режиме (94.65% на caniouse):
    API to allow messages to be pushed from a server to a browser, even when the site isn't focused or even open in the browser.
    Ответ написан
    1 комментарий
  • Можно ли тестировать javascript код по кнопке на клиенте?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Нет, jest только под nodejs работает (или через запросы на сервер можно какие костыли придумать).
    Есть еще Mocha, которая:
    JavaScript test framework running on Node.js and in the browser

    Можно ее использовать.

    Jest это лишь инструмент, который помогает писать тесты. Вы можете и не использовать его для тестирования:
    const sum = (a, b) => a + b;
    
    test('adds 1 + 2 to equal 3', () => {
      expect(sum(1, 2)).toBe(3);
    });

    const sum = (a, b) => a + b;
    
    function testSum(description, a, b, expected) {
      const result = sum(a, b);
      if (result === expected) {
        console.log(`✓ ${description}`);
      } else {
        console.error(`✗ ${description}: expected ${expected} but got ${result}`);
      }
    }
    
    testSum('adds 1 + 2 to equal 3', 1, 2, 3);

    Пишите свои обертки и запускайте их на клиенте.
    Ответ написан
    Комментировать
  • Где попрактиковаться с табличными данными, как Pandas, в JS?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    А что вам мешает взять задачи для питоновской Pandas'ы? google.com
    Поиск выдает репы с задачками и решения к ним. Код на python вам не нужен, но output посмотреть можно.
    Решайте задачи - сверяйте output:
    https://github.com/aakankshaws/Pandas-exercises
    https://github.com/guipsamora/pandas_exercises
    https://github.com/tommyod/awesome-pandas
    https://medium.com/%40foklacu/the-ultimate-collect...

    ps на крайний случай можно конвертировать код из python в js, если совсем какие-то проблемы появились с задачей
    Ответ написан
    1 комментарий
  • Как на JavaScript расшифровать строку с помощью ключа?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Так (для nodejs)?
    const crypto = require("crypto");
    
    const encryptedData =
      "jPNGTNLtGIBc7Jv2UXj7a3FNQk13eUJ5T3VIUXlOS0ZVOEpnMUpPMnhvQXg5bE5kMGFHejVxaTFnYTA9";
    const key = "qEExPE+jkJxQUt8fSO+XwzXgRGh6kLHy+lWEe6Z8T6s=";
    
    const decodedKey = Buffer.from(key, "base64");
    const decodedData = Buffer.from(encryptedData, "base64");
    const ivLength = 16; 
    
    const iv = decodedData.slice(0, ivLength);
    const encryptedText = decodedData.slice(ivLength);
    
    const decipher = crypto.createDecipheriv("aes-256-cbc", decodedKey, iv);
    
    try {
      let decrypted = decipher.update(encryptedText, null, "utf8");
      decrypted += decipher.final("utf8");
      console.log("Расшифрованная строка:", decrypted);
    } catch (error) {
      console.error("Ошибка расшифровки:", error.message);
    }
    Ответ написан
    4 комментария
  • Как создать прототип и расширить его в JS?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Допустим через spread operator:
    const commonOpt = {
      key: 'val',
      key1: 'val1'
    }
    
    const unitedOpt = {
      ...commonOpt,
      key: 'lav'
    }


    Через Object.assign:
    const commonOpt = {
      key: 'val',
      key1: 'val1'
    }
    
    const unitedOpt = Object.assign(commonOpt, { key: 'lav' })

    Что-то такое надо? Если надо глубокое слияние, то пишем свой deepMerge или используем lodash и еще какую готовую версию. А вообще почитайте про паттерны (builder и тд)
    Ответ написан
    1 комментарий
  • Как сделать dynamicBullets swiper не по середине?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Вот стандартные стили у "булетов":
    .swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic, .swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic {
        left: 50%;
        transform: translateX(-50%); 
        white-space: nowrap;
    }

    Переопределите под ваши нужды. Например так:
    .swiper-pagination-bullets {
      left: 0 !important;
      transform: translateX(0) !important; 
    }


    Офф. пример с их сайта:

    если необходимо добавить кликабельность, которая изначально отключена, то меняет свойство clickable на true
    Ответ написан
    Комментировать
  • Как эффективно заменить текущий HTML элемент на другой?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    https://jsfiddle.net/Lfst8wog/1/
    const childElement = document.getElementById('child'); // находим потомка
    const parentElement = childElement.parentNode; // находим родителя
    
    // Создаем новый элемент
    const newElement = document.createElement('p');
    newElement.textContent = 'Новый элемент';
    
    // Заменяем старый элемент на новый
    parentElement.replaceChild(newElement, childElement);


    Или так (https://jsfiddle.net/Lfst8wog/)
    const oldElement = document.getElementById('old');
    
    // Создаем новый элемент
    const newElement = document.createElement('div');
    newElement.textContent = 'Новый элемент';
    
    // Заменяем старый элемент новым
    oldElement.replaceWith(newElement);


    const oldElement = document.getElementById('old');
    
    oldElement.replaceWith(document.createRange().createContextualFragment(`
      <div class="box box2">
        <p1>hello world</p1>
      </div>
    `));
    Ответ написан
    3 комментария
  • Почему возникает ошибка в работе маркера в GoogleMap?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Я так понимаю, что эти стили используются для скрытия всплывающего окна:
    ... {
      opacity: 0;
      scale: 0
    }

    Эти стили не удаляют элемент со страницы, и он остаётся доступным для взаимодействия. Чтобы полностью скрыть элемент, используйте display: none или visibility: hidden. Либо добавьте pointer-events: none для скрытого состояния и pointer-events: auto для видимого, чтобы сохранить анимацию.
    Ответ написан
  • Как из строки сделать массив объектов?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    const queryString =
      "room_number[]=2&room_number[]=3&room_number[]=4&price_min=111&price_max=999&area[]=Ленинский район"
    
    function convertQueryString(query) {
      const result = []
      const pairs = query.split("&")
    
      pairs.forEach((pair) => {
        const [name, value] = pair.split("=")
        const cleanName = name.replace(/\[\]/g, "")
    
        result.push({
          name: cleanName,
          value: decodeURIComponent(value),
        })
      })
    
      return result
    }
    
    const output = convertQueryString(queryString)
    console.log(output)


    const queryString = "room_number[]=2&room_number[]=3&room_number[]=4&price_min=111&price_max=999&area[]=Ленинский район";
    
    const output = queryString.split('&').map(pair => {
      const [name, value] = pair.split('=')
      return {
        name: name.replace(/\[\]/g, ''),
        value: decodeURIComponent(value),
      }
    })
    
    console.log(output)
    Ответ написан
    Комментировать
  • JS как отследить скролл сверху у элемента?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    function scrollToElementWithOffset(element, offset = 0, behavior = 'smooth') {
        const elementTopPosition = element.getBoundingClientRect().top
        const offsetPosition = elementTopPosition + window.pageYOffset - offset
        
        window.scrollTo({
            top: offsetPosition,
            behavior,
        })
    }
    
    const targetElement = document.querySelector('#myElement');
    scrollToElementWithOffset(targetElement, 100)


    ps или можете добавить перед блоком, к которому нужно прокрутить, элемент div с необходимым отступом и затем использовать метод scrollIntoView для скрола к нему
    Ответ написан
    Комментировать
  • Как мне написать скрипт для вывода изображения bootstrap 5 и js?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Через radio кнопки и label делайте если без js. Вот пример "на коленках" сделал:
    Ответ написан
    Комментировать
  • Почему не запускается storybook?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Ответ написан
    Комментировать
  • Как с помощью CSS и HTML сделать такой эффект как на картинке?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Вариантов есть несколько: через background-image, через canvas, через SVG маски... Вот пример через bg:
    Ответ написан
    Комментировать
  • Напишите код, которой переделает структуру данных вот в такую?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    let events = {
        '2019-12-29': ['name1', 'name3', 'name5', 'name7'],
        '2019-12-30': ['name4', 'name8', 'name9'],
        '2019-12-31': ['name2', 'name6']
    };
    
    // Преобразуем объект в массив объектов с помощью метода reduce
    // Object.keys(events) возвращает массив дат (ключей объекта events)
    let result = Object.keys(events).reduce((acc, date) => {
        // acc (аккумулятор) — это значение, которое сохраняется между итерациями
        // date — это текущий элемент массива (в данном случае дата из объекта events)
    
        // На каждой итерации для текущей даты перебираем все события
        events[date].forEach(event => {
            // Добавляем объект { date, event } в аккумуляторный массив acc
            acc.push({ date, event });
        });
        // Возвращаем аккумулятор после обработки всех событий для текущей даты
        return acc;
    }, []); // [] — начальное значение аккумулятора, с которого начинается накапливание данных
    
    // Как работает reduce:
    // 1. В начале acc равен [] (пустой массив).
    // 2. На каждой итерации мы добавляем в acc новые объекты { date, event }.
    // 3. Когда все даты и события обработаны, reduce возвращает конечный аккумулятор — массив объектов.
    
    // Выводим результат в консоль
    console.log(result);
    Ответ написан
  • Собраный через pkg exe файл не работает без папки node_modules?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Разве NodeExternals не создан именно для того, чтобы исключать node_modules из сборки?
    When bundling with Webpack for the backend - you usually don't want to bundle its node_modules dependencies. This library creates an externals function that ignores node_modules when bundling in Webpack.
    Ответ написан
  • Можно ли поменять настройки daterangepicker js при срабатывании events?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    А у Вас какая задача-то? Просто поменять расположение стрелки? Если да, то можно просто классы поменять. Собсно, есть opensright и opensleft, которые отвечают за расположение этой стрелки:
    $('.daterangepicker').addClass('opensleft').removeClass('opensright');
    // $('.daterangepicker').addClass('opensright').removeClass('opensleft');


    Если у Вас какая-то более сложная логика отображения стрелки, то у инстанса picker'а есть методы:
    - updateElement
    - updateCalendars
    - show
    - hide
    Думаю, что можно попробовать вызвать метод обновления picker'а после изменения настроек (скрыть/открыть опционально)

    Ну, или на крайний случай просто удалить picker (picker.remove()) и инициализировать его с новыми опциями (написать отдельную функцию для инициализации, которая будет принимать опции)
    Ответ написан
    1 комментарий
  • Как у swiper добиться такого эффекта слайдера?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    У Вас на каждом шаге есть спец. селекторы для слайдов:
    1. swiper-slide
    2. swiper-slide-prev
    3. swiper-slide-active
    4. swiper-slide-next
    5. swiper-slide

    ну и добавляйте стили для них какие и куда вам нужны. Или можно через effect/creativeEffect задать стили

    Например:
    - через стили https://jsfiddle.net/13txkeL8
    - через effect https://jsfiddle.net/jz6tb8a5/
    Что-то такое нужно было?

    зы можно ссылку на сайт с каруселью?
    Ответ написан
    Комментировать
  • Выезжающее меню с анимацией?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Обычно это называют Elastic SVG/Menu. Вот демо на tympanus. Там же можно и статью найти, которая объясняет реализацию.

    Если нравиться больше видео версия, то на YouTube есть плейлист с аналогичным туториалом - ссылка
    66bd9ec52a42d919375208.gif
    Ответ написан
    2 комментария