Ответы пользователя по тегу JavaScript
  • Не могу передать FormData в Electron js, как сделать правильно?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    В main.js отправляйте путь к файлу. А уже оттуда считывайте его содержимое.
    Ответ написан
    1 комментарий
  • Как сделать рабочим несколько слайдеров?

    Kozack
    @Kozack Куратор тега CSS
    Thinking about a11y
    Изолируйте весь код в какой-либо контекст. Далее, в этот контекст передавайте контейнер слайдера. А в самом коде выполняйте поиск элементов-контролов не глобально по документу, а только в пределах переданного контейнера.
    Что-то в таком духе:
    function makeSlider(slider) {
      ...
    }
    
    document.querySelectorAll('.slider').forEach(makeSlider)
    Ответ написан
    Комментировать
  • Как на кнопку повесить два события, сначала обновить страницу а потом произвести расчет калькулятора?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Делаете обычную ссылку с каким-либо маркером, например:
    <a href="test.html#calculate-results">Рассчитать</a>

    А на странице test.html при загрузке проверяете есть ли этот маркер. Если ест -- запустить расчеты.
    Ответ написан
    Комментировать
  • Как отслеживать расстояние от верха страницы до блока?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    window.addEventListener('scroll', function _scrollhandler() {
      // ... ваш код проверки
      window.removeEventListener('scroll', _scrollhandler)
    })
    Ответ написан
    Комментировать
  • Как переписать десктопное приложение с C# на JavaScript?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Комментировать
  • Как получить результаты нескольких первых выполненных Promise?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Ну, вот вам с ходу костыль:
    1. Создаёте AbortController и передаёте его во все вызовы.
    2. Для каждого вызова добавляете один и тот-же обработчик
    3. В нем, условно пушите полученный результат в какой-то массив. И тут же проверяете количество результатов в этом массиве.
    4. Если их два -- вызвать abort чтобы отменить все остальные вызовы
    Ответ написан
    Комментировать
  • Как вывести данные из массива JS в CSV файл?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    csv -- comma-separated values.
    arr.join(',') // Строка в csv формате
    Ответ написан
  • Как среагировать на факт изменения объекта?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Вы можете использовать систему реактивности из фреймворка Vue. Вам не нужен весь фреймворк. Достаточно только @vue/reactivity (работает на Proxy)

    Пример:
    import { computed, effect, reactive } from "@vue/reactivity";
    
    const obj = reactive({ foo: 1 }); // Реактивная переменная
    const doubleFoo = computed(() => obj.foo * 2); // Вычисляемое свойство (Реактивная переменная которая автоматически пересчитывается когда изменяется какая-либо из использованных внутри реактивных переменных)
    effect(() => console.log("doubleFoo value changed to:" + doubleFoo.value)); // Функция, запускается когда изменяется какая-либо из использованных внутри реактивных переменных)
    
    // Каждую секунду изменяет значение obj.foo
    // После чего автоматически пересчитывается значение doubleFoo 
    // После изменения doubleFoo вызывается функция переданная в effect и выводится сообщение в лог
    setInterval(() => obj.foo++, 1000)


    https://codesandbox.io/embed/ecstatic-wind-68ez4?f...
    Ответ написан
    2 комментария
  • Как сравнить текущий элемент массива со следующим?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Перед сравнением, проверить что следующий элемент !== undefined
    Ответ написан
    Комментировать
  • Как отправить форму без валидации?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Добавьте атрибут novalidate на форму.
    https://developer.mozilla.org/ru/docs/Web/HTML/Ele...
    Ответ написан
    Комментировать
  • Стоит ли разбивать css/js для разных страниц?

    Kozack
    @Kozack Куратор тега CSS
    Thinking about a11y
    В общем случае -- стоит.

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

    Можно всё сгрести в один огромный бандл. Тогда первичная загрузка будет дольше, особенно ощутимо на медленном интернете. Но навигации по страницам будут быстрее, а нагрузка на сервер меньше. Но при изменении, скажем цвета одной кнопки, пользователю придётся заново качать весь бандл. И наоборот. Можно уйти и в другую сторону: дробить всё на как можно меньшие кусочки. (Например вынести весь код для какой-то модалки отдельно) и загружать каждый чанк только в момент когда он понадобится. Так первичная загрузка будет намного быстрее, но реакция на действия пользователя будет медленнее.

    В общем случае -- дробить код сайта на куски и отдавать их частями -- стоит. Но вмеру. А как именно делить -- зависит от вашего случая.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы скрипт работал только на одной странице?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Сделайте так, чтобы этот скрипт присутствовал только на нужной странице, а на остальных его не было.
    Ответ написан
  • Как изменить вложенное поле?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    1. Пишете цикл, которые перебирает какой-то массив объектов и передаёт каждый объект в условную функцию changePostedAt
    2. Функция changePostedAt изменяет поле postedAt. Затем находит массив в answers и для каждого объекта в этом массиве вызывает changePostedAt.
    Ответ написан
    Комментировать
  • Позиционирование модального окна?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    1. В момент клика, перед тем как сделать всплывающее окно видимым вы считываете позицию указателя (координаты x, y). Это предварительные координаты для вашей модалки.
    2. Далее вы вычисляете размер самой модалки. И проверяете не вылезет ли она за границы экрана. Например: если Х координата + Ширина модалки больше чем ширина контейнера -- сдвинуть мобалку в лево настолько чтобы она помещалась.
    3. Применить полученные значения позиционирования к элементу и сделать его видимым.
    Ответ написан
    Комментировать
  • Парсинг JSON в воркере?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Я бы отдел предпочтению в пользу отказа от воркера. Такой подход имеет место быть только если у вас очень большие JSON. Настолько большие или так много, что время на их обработку заметно невооруженным взглядом.

    Если же это нетак, тогда, как по мне, было бы удобнее держать сокет в основном потоке. Это даст возможность всем компонентам независимо друг от друга подписываться на разные события. Что-то в таком духе:

    // socketFactory.js
    let ws = null
    
    export function getSocket() {
      if (!ws) ws = new WebSocket('wss://someaddr');
      return ws
    }


    // SomeComponent.vue
    import {getSocket} from 'socketFactory.js'
    const ws = getSocket()
    
    export default defineComponent({
      created() {
        ws.onmessage(message => {
          if ( ... ) {
            // Делаем что-то с сообщением
            this.onMessageHandled(message)
          }
        })
      },
    })


    Таким образом каждый компонент может общаться с сокетом не зависимо. При этом отпадает нужда во Vuex. Мой пример далёк от идеала, тут стоило бы вообще сокет вынести на ещё один слой абстракции, но я надеюсь идею вы поняли.

    И подчеркну, что это всё может быть вредно, так как я не знаю всей вашей архитектуры.
    Ответ написан
  • Как исправить эту ошибку?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Ошибка говорит вам "Вы пытаетесь использовать import но вы не находитесь в модуле JS".

    надо добавить строчку "type": "module" в package.json

    Это превращает все файлы в "модули" для Node.JS среды исполнения. Но если вы пытаетесь запустить этот код в браузере, то этот параметр ничего не даст. Чтобы ваш код был модулем, вы должны в тег <script> добаивть атрибут type: <script type="module">. Теперь весь код в этом теге (и всё что он импортирует) будет считаться модулем.

    https://github.com/highcharts/highcharts#load-high...
    Ответ написан
    Комментировать
  • Как остановить цикл до выполнения ajax?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    На JavaScript цикл forумеет ожидать результат промиса на каждой итерации
    for (data of datas) {
      await fetch( ... ) 
    }
    Ответ написан
    2 комментария
  • Почему remove удаляет класс, только последнего элемента массива?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Это потому, что каждая итерация цикла перезаписывает функции addSwiper и removeSwiper. Как результат после завершения цикла в этих переменных остаются функции которые туда были записаны при последней итерации -- то есть для обработки последнего элемента массива.
    Ответ написан
    3 комментария
  • Как отловить нажатие клавиши с Bluetooth гарнитуры на JS в браузере?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    https://web.dev/media-session/
    Вы вешаете обработчик событий play/pause. А эти события вызываются и при клике по системным контроллам в ОС и по нажатию клавиш на гарнитурах и так далее.
    Ответ написан
    Комментировать
  • Объект не может конвертироваться в другой тип данных?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    String(a) возвращает результат прообразования, но исходный объект остаётся неизменным.

    const strA = String(a)
    typeof strA // string
    Ответ написан
    Комментировать