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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если у тебя по капотом хром, то наверное ты можешь использовать fetch в котором у Request body - это ReadableStream, растянув таким образом запрос настолько - насколько надо. Но это всё же не совсем то же самое что просто медленный запрос.
    Полноценного же низкоуровневого контроля над запросом никто тебе из js не даст.
    Ответ написан
    4 комментария
  • Почему при указании пути, картинка не выводиться в js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Оно работает с содержимым изображения на низком уровне, это ради безопасности запрещено для картинок с чужого домена(кроме тех, для которых это явно разрешено со стороны сервера загловком access-control-allow-origin).
    Если слайдер и картинки будут храниться на одном и том же сайте - проблем не будет. Иначе - надо настраивать access-control-allow-origin на сервере отдающем картинки, или, если картинки чужие, делать свой прокси-сервер.
    Ответ написан
  • Почему проект, собранный через vite не позволяет открыть сборку локлаьно через index.html?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Почему?
    Потому что в классическом виде это один js файл подключённый через script, а в виде модулей - это множество файлов которые дополнительно грузятся внутри script. Ограничения безопасности браузеров по разному работают в данных ситуациях.

    Что делать?
    Не открывать современные приложения локально. Просто забудь о такой возможности. Установи глобально какой-нить alive-server и запуская через него. Если надо это распространять - прилагай микросервер в комплекте или смотри в сторону всяких виндовых однофайловых вариантов\pdf.
    Ответ написан
    3 комментария
  • Как добавлять в div per-message элементы, но удалять per-string?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если шрифт моноширный то какие проблемы то? Высоту ты знаешь ширину ты знаешь. Высоту и ширину символа - тоже знаешь. Соответственно знаешь сколько символов поместится в строке. Берёшь количество символов да считаешь...
    Ответ написан
    Комментировать
  • Как скрыть элемент страницы с помощью tampermonkey (userscript) в iframe, содержимое которого сделано через react?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Проще всего это делается через css селектор атрибутов вида [class^="chat__root__"] . Заметьте я использовал не полное имя класса, а только начало и модификатор ^= указывающий сверять только начало(если класс не первый, то можно использовать *=). Почему? Потому что "непонятные буковки" в конце - это генерируемый при сборке хэш, который поменяется при выпуске следующей версии фронта и если вы к нему привяжитесь - ваш скрипт очень скоро перестанет работать.

    Если фрейм с другого адреса, то надо создать этот userscript именно для этого адреса и уже применять там:
    // @run-at document-start
    
    function addCss(css, root = window) {
      const style = root.document.createElement('style');
      style.innerHTML = css;
      (root.document.head || root.document.documentElement).append(style);
      return style;
    } 
    
    const css = `
      [class^="chat__root__"] {
        dislpay: none !important;
      }
    `;
    
    addCss(css);

    Если с этого же, то придётся заморочиться:
    // @run-at document-start
    
    const css = `
      [class^="chat__root__"] {
        dislpay: none !important;
      }
    `;
    
    // отлавливаем загрузку фреймов
    new MutationObserver(() => {
      document.querySelectorAll('iframe:not([us-processed]').forEach((iframe) => {
        if (isAccessibleFrame(iframe)) {
          // добавляем наш css
          addCss(css, iframe.contentWindow);
          
          // на случай если содержимое фрейма перепишут позднее
          iframe.addEventListener('load', () => addCss(css, iframe.contentWindow));
        }
        // помечаем что обработали этот фрем, чтоб не повторять
        iframe.setAttribute('us-processed', true);
      });
    }).observe(document, {childList: true, subtree: true});
    
    // проверяем что содержимое фрейма доступно 
    function isAccessibleFrame(iframe) {
      try {
        iframe.contentWindow.test
        return true
      } catch (e) {
        return false
      }
    }
    Ответ написан
  • Почему не работает Array.from(value) при переводе formData в массив?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ну да, Array.from(File) - пустой массив, потому что у File нет ни length ни числовых индексов, а чего ты хотел?

    FormData хранит множество файлов как множество записей с одинаковым именем, по одному файлу в каждой, а не как одну запись с массивом всех файлов.
    Ответ написан
    Комментировать
  • Как правильно настроить swiper в react?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Компонент Swiper не ждёт свойства spaceBetween. Вы уверены, что оно хоть что-то делает?

    Если это баг типизации Swiper и на самом деле он такое свойство ждёт, то вам следует репортить этот баг автору компонента (предварительно обновившись до последней версии).

    В крайнем случае можно прибегнуть к declaration merging, но это вредный костыль:
    declare module 'путь до типов компонента Swiper' {
      interface SwiperProps {
        spaceBetween: number;
      }
    }
    Ответ написан
    Комментировать
  • Как пофиксить баг методов scrollTo и scrollIntoView в chrome?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Написать в багтреккет хрома.:)

    Такая шляпа наблюдается только при smooth. Можешь пока убрать его для хрома пока не починят. Ну или использовать какую-нить кастомную либу для smooth скола.
    Ответ написан
  • Prettier ставит ненужные скобки, как отключить?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Прям на главной странице написано: Prettier - An opinionated code formatter.
    Иными словами: не нравится как форматирует prettier - не используй его. Иных вариантов нет.
    Ответ написан
    Комментировать
  • Как отследить область события "click"?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    if(event.target.closest('<селекторы которые надо игнороиовать>'))
      return;
    // закрываем
    Ответ написан
    Комментировать
  • Как перевести дробное число в строку с сохранением нулей в конце (JS)?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    ...продолжая из комментов:
    Grione, эти данные приходят как?
    В json?
    Тогда единственный разумный вариант - пусть бэк переделывает и отправляет сразу строку.

    В каком-то своём формате?
    Тогда сам читай его сразу как строку.

    В json, но надо обязательно на фронте?(на самом деле не бывает таких ситуаций, бывает мало вони и эскалации)
    Пили мега-костыль: бери готовую кастомную библиотеку для парсинга json, форкай её, вноси нужные изменения и используй для этих данных.
    Ну или, если совсем всё плохо, и ты знаешь как точно будут выглядеть приходящие данные, то можно регуляркой заменить перед парсингом:
    function monkeyParse(responseText) {
      responseText = responseText
        .replace(/("field-name"\s*:\s*)(\d(?:\.\d+)?)/g, '$1"$2"');
      return JSON.parse(responseText);
    }
    monkeyParse('{ "field-name": 1.1000 }'); // { "field-name": "1.1000" }

    Но это совсем уж небезопасная какашка.:)
    Ответ написан
    1 комментарий
  • Как удалять теги из массива, которые уже не используются?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    В таком виде оптимально это никак не сделать, только с полным перебором записей каждый божий раз, как предлагает 0xD34F.

    Оптимальнее же сделать можно изменив структуру на:
    {
      "tags": {
        "юр": 2,
        "зозпп": 1,
        "файл": 1,
        "пароль": 1,
        "сервер": 1
      },
      "data": [
        {
          "title": "заголовок 1",
          "content": "запись 1",
          "tags": [
            "юр",
            "зозпп"
          ]
        },
        {
          "title": "заголовок 2",
          "content": "запись 2",
          "tags": [
            "юр"
          ]
        },
        {
          "title": "заголовок 3",
          "content": "запись 3",
          "tags": [
            "файл",
            "пароль",
            "сервер"
          ]
        }
      ]
    }

    Тогда при добавлении записи просто плюсуете количество использований тэга, при удалении минусуете. Если стало 0 - удаляете.

    Хотя, конечно, если всё это на простых файликах и всё равно грузится в память - смысла слишком оптимизировать тут никакого нет.:)
    Ответ написан
    Комментировать
  • Как эмулировать клик по кнопке?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    function findLink(text) {
      for (const a of document.querySelectorAll('.amt-link > a:not(._lock-time)')) {
        if (a.textContent.trim() === text)
          return a.href;
      }
      return '';
    }
    findLink("Ярость богов")
    Ответ написан
    6 комментариев
  • Как перехватить перезагрузку страницы средствами JavaScript во Vue.js 3?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Никак. Пользователь сам решает, что ему делать.
    Ты можешь только запилить большую красивую кнопку "Обновить", чтоб ему захотелось нажать на неё, а не на стандартную.:)
    Ответ написан
  • Как перебрать селекторы через for?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Поменять кавычки с " на `, которые включают режим шаблонных строк.

    Но ващет проще document.querySelectorAll и перебрать уже как массив, без таких извращений.
    Ответ написан
    2 комментария
  • Можно ли приостановить функцию до "приёма сигнала"?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Сделать то можно, например так:
    const moveQueue = {
      queue: [],
      index: 0,
      create() {
        let endMoveCallback;
        // создаём висячий промис и присваиваем его разрешение в endMoveCallback
        const movePending = new Promise(resolve => endMoveCallback = resolve);
        // index чисто для лога
        endMoveCallback.index = this.index++; 
        // добавляем в очередь
        this.queue.push(endMoveCallback);
        // возвращаем проис ждущий вызова endMoveCallback
        return movePending;
      },
      last() {
        // забираем из очереди последнее добавленное
        return this.queue.pop();
      }
    }
    
    async function turn() {
      await startMove();
      await startShoot();
    }
    
    function startMove() {
      console.log('startMove', moveQueue.index);
    
      return moveQueue.create();
    }
    
    function endMove() {
      const activeMoveEnd = moveQueue.last();
      if (activeMoveEnd) {
    
        console.log('endMove', activeMoveEnd.index)
    
        activeMoveEnd();
      } else {
        onsole.error('`endMove` called when there are no active moves')
      }
    }
    
    function startShoot() {
      console.log('startShoot');
    }
    
    turn();
    setTimeout(() => endMove(), 1000)

    Но скорее всего у тебя что-то не то с архитектурой, и тебе лучше будет почитать книжки по геймдеву.
    Ответ написан
    Комментировать
  • Как найти ошибку Uncaught SyntaxError: Unexpected token?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Эта ошибка в 100 - 10^-18 случаях из 100 появляется когда вместо js файла по ссылке ваш сервер отдаёт отдаёт html файл, чаще всего index, но может и страницу ошибки 404, 403, 503 и т.п.

    Почему она возникает:
    а) неправильно указан путь до файла .js(или вы вообще забыли его положить);
    б) неправильно настроен сервер;
    с) если прилетает страница ошибки - см. описание ошибки.

    P.S. live-server это не "стандартный сервер", это сторонний софт, причём мёртвый несмотря на название. Живой на данный момент форк - alive-server. Но проблема, если что, не в этом.:)
    Ответ написан
    Комментировать
  • Как заставить div уменьшаться и увеличиваться в зависимости от свободного места?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    .main-container
      display: flex
    .content
      flex: auto

    Проблема то в чём?
    Ответ написан
    1 комментарий
  • Как остановить цикл по нажатию кнопки html / js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Никак.
    По умолчанию, без специальных ухищрений, javascript работает в одном потоке.
    Пока цикл не завершится - вообще больше ничего не произойдёт, в т.ч. реакция на клик - страница тупо "зависает".
    Ответ написан
    Комментировать