Задать вопрос
  • Есть возможность получить статус значка загрузки страницы браузера?

    Aetae
    @Aetae
    Тлен
    Иконка меняется на спинер браузером когда происходит загрузка страницы.(а также объектов, требующих загрузки, типа скриптов, картинок и фреймов).
    Можно быть уверенным, что спиннер крутится, если document.readyState !== 'complete'. Однако если подгрузка чего-то происходит позднее, то, увы, об этом никак (надёжно) не узнать, потому что это поведение - чисто интерфейсное решение браузеров и нигде не документировано.

    Можно заставить его крутиться когда хочешь добавляя и убирая iframe с "вечной загрузкой".
    Но проще просто менять favicon как указал Алексей Ярков.
    Ответ написан
    2 комментария
  • Где в HTML правильно подключать скрипты к странице?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    It depends.

    Страница отображается в браузере по мере загрузки. Если в ней встретится скрипт без спец. атрибута типа async\defer отображене будет остановлено пока не загрузится И выполнится скрипт.

    Вот собственно почему советуют сдвигать скрипты вниз. Но если без скрипта у тебя ничего не заработает, то это не имеет смысла.

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

    Aetae
    @Aetae
    Тлен
    Ну а что ты хочешь? Кодировка в виндовом терминале отличается от кодировки сайта.
    Напиши в терминал chcp 65001.)
    Ответ написан
    Комментировать
  • Как динамично сформировать объект?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Как обычно:
    ["first", "second", "third"].reduce((acc, value, i) => {
      acc[`answer${i+1}`] = value;
      return acc;
    }, {});

    Только вот если у тебя в коде вдруг появляются переменные(и свойства) отличающиеся только цифрой на конце - ты явно что-то делаешь не так.
    Ответ написан
  • Как рекурсивно принимать json через API?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Условно как-то так:
    useEffect(() => {
      const fetchData = async (url: string, data: any[] = []) => {
        const res = await fetch(url);
        const json = await res.json();
        if(json.pagination.links.next){
          await fetchData(json.pagination.links.next, data)
        }
        data.push(json.data);
        return data;
      };
      
      fetchData("https://gorest.co.in/public/v1/users").then(setData);
    }, [url]);

    в data будет массив.

    Кстати рекурсия тут не обязательна:
    useEffect(() => {
      const fetchData = async (url: string) => {
        let data: any[] = [];
    
        do {
          const res = await fetch(url);
          const json = await res.json();
    
          data.push(json.data);
    
          url = json.pagination.links.next;
        } while (url);
    
        return data;
      };
    
      fetchData("https://gorest.co.in/public/v1/users").then(setData);
    }, [url]);


    Ну и вместо any - расставить твои типы надо.
    Ответ написан
    3 комментария
  • Vue + axios, как отменить предыдущий запрос если выполнился новый?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Ответ написан
    Комментировать
  • Зачем нужно усложнять код?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    В твоём примере последняя итерация лишняя - i выходит за пределы массива, тебе надо было написать либо так:
    function funk (arr) {
      for(let i = 0, length = arr.length - 1; i < length; i++) {
        if(arr[i] === arr[i+1]) {
          return true;
        }
      }
      return false;
    }

    либо, лучше, так:
    function funk (arr) {
      for(let i = 1; i < arr.length; i++) {
        if(arr[i - 1] === arr[i]) {
          return true;
        }
      }
      return false;
    }

    Также заметь, что в современном JS никто не использует сравнение с приведением типов(==) из-за его ненадёжности, только полноценное сравнение - ===.

    "Пример из интернета" - полная фигня. Кто-то впихнул костыль на ровном месте, решая ту самую "проблему", что имеет место быть в твоей реализации, вместо того чтоб подумать и написать один из предложенных мной выше вариантов.)
    Ну по крайней мере теперь ты знаком с профессиональным термином костыль и как его применение выглядит в коде.)
    Ответ написан
    5 комментариев
  • Как решить ошибку Cannot GET /solm?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Вангую у тебя сервер не настроен под тип роутинга history. Гугли как настраивать твой сервер под SPA(все не-API пути должны быть заёрнуты на index.html). Ну или переключи роутер в режим hash.
    Ответ написан
    Комментировать
  • Как Tor-браузер обрабатывает ajax запросы?

    Aetae
    @Aetae
    Тлен
    Дело не в торе. Если href пустой - это значит от ведёт на текущую страницу. Нажимаешь на ссылку - происходит перезагрузка страницы и всё. Никакая функция при этом не отрабатывает.
    Ответ написан
  • Выводится массивом, как убрать скобки и ковычки?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    При чём тут Vue? Ты выводишь массив - тебе показывают массив.
    Хочешь чтоб была строка - сделай из массива строку. Хотя бы через .toString(), или как либо более специфично.
    Ответ написан
    Комментировать
  • Можно ли объявлять методы и тд по условию?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Какие проблемы?
    created() {
      if(mobile){
        this.touchStart = () => {}
      }
    }

    Но поскольку mobile или не mobile определяется один раз в жизни приложения, то логичней вынести определение функций\методов в отдельный файл, типа:
    let touchStart;
    if(mobile){
      touchStart = function() {}
    } else {
      touchStart = function() {}
    }
    
    export {
      touchStart
    }
    import {touchStart, ...} from './helpers';
    methods: {
      touchStart,
      ...
    }

    Либо как миксин:
    const touchMixin = {
      methods: mobile ? {
        touchStart() {}
      } : {
        touchStart() {}
      }
    }
    mixins: [touchMixin],
    Ответ написан
    2 комментария
  • Как решить вопрос срабатывания $('').submit(); за пределами form в firefox?

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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    По сути тебе нужно написать свой языковой парсер. Который разобьёт входные значения на лексемы и всё такое прочее и интерпретирует результат. Можешь изучить теорию компиляторов, чтоб совсем хорошо было.)
    Но вообще тут и простого конечного автомата хватит, если нужна поддержка скобок, или даже минимальной работы со строками - если нет.
    Ну или воспользоваться готовой библиотекой как предложили выше.
    Ответ написан
    1 комментарий
  • Как использовать Tailwind только для навешивания классов и не перебивать Vuetify?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Префикс решает проблемы. Если у тебя надо включить какой-то кусок готового кода где уже прописаны классы и ты их не можешь менять - то грусняшка.
    Если поддержка IE не нужна, то в принципе ты можешь этот кусок кода завернутьв в web-component и туда подгрузить css. Тогда, по идее css пересекаться не будут.
    Ответ написан
    Комментировать
  • Почему babel компилирует React в 25к+ строк кода?

    Aetae
    @Aetae
    Тлен
    Естественно компилирует всё что нужно для реакта из node_modules.
    А как иначе реакт работать то будет, без самого реакта?)
    Ответ написан
    3 комментария
  • SOLID Единая ответственность - стоит ли мне в данном случае написать отдельный класс?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    calcAmount по SOLID должен быть методом у объекта с этими ключами.
    Т.е. допустим с сервера пришла
    const data = [{"id": 1, "a": 99, "b": 100}, {"id": 2, "a": 1 "b": 2}];

    Перед тем как с ней что-то делать, ты преобразуешь её в типизированную структуру:
    interface Calculable {
      calcAmount(): number;
    }
    
    class CalculableAB implements Calculable {
      constructor(obj) {
        Object.assign(this, obj);
      }
      calcAmount() {
        const {a, b} = this;
        return a + b;
      }
    }
    
    struct = data.map(obj => new CalculableAB(obj));

    Ну и дальше при работе с любым Calculable ты просто вызываешь у него calcAmount(). Как оно там реализовано - тебя не волнует.

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

    Aetae
    @Aetae
    Тлен
    Ну какбэ не заморачиваться.
    Хранить часовой пояс пользователя, работать по серверному UTC времени.
    Разрешить менять часовой пояс пользователю только раз в день(неделю\месяц) и только руками в настройках.
    При смене часового пояса юзера - смотреть, чтоб это не сбросило ему "стрик", сдвинув в ту или иную сторону, но не чаще/реже чем N(сверить с датой последнего пройденного) - тут уж сами смотрите, как у вас там что, но не думаю, что это будет сложнее пары if'ов.
    Ну и предупреждение юзеру мол "Внимание, при смене ЧП следующий эвент будет тогда-то".
    Ответ написан
    Комментировать
  • Vue+js как сделать чтобы axios выполнялся поочередно?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Если это именно то, чего ты хочешь, то ты можешь сделать себе очередь, условно так:
    class AsyncQueue {
      constructor(result) {
        this.queue = [];
        this.result = result;
      }
      isStreaming = false;
      add(promise) {
        this.queue.push(promise);
        if(!this.isStreaming)
          this.stream();
      }
      async stream() {
        this.isStreaming = true;
        for await (const result of this.queue) {
          this.result(result);
        }
        this.queue.length = 0;
        this.isStreaming = false;
      }
    }

    Vue:
    data() {
      const schedulesQueue = new AsyncQueue(this.showLoadedSchedules);
      return {
        schedulesQueue,
        // ...
      }
    },
    
    methods: {
      showLoadedSchedules(response) {
        if(this.curDateEvent) {
          this.changeMobileDay(this.curDateEvent);
        }
        // ...
      },
      addSchedulesToQueue(locationId, gameModeId, selectedHeadsets, day) {
        let param = 'locationId=' + locationId + '&gameModeId=' + gameModeId + '&headsets=' + selectedHeadsets
    
        if (day)
          param += '&day=' + day;
    
        return this.schedulesQueue.add(
          axios({
            method: 'get',
            url: 'schedules?' + param
          }).catch((error) => {})
        );
      }
    }
    Ответ написан
    Комментировать
  • Как сделать нестандартные стрелки?

    Aetae
    @Aetae
    Тлен
    1. Попросить исходники стрелки, наверняка вектор.
    2. Обрисовать стрелку в векторном редакторе и сохранить в svg.
    3. Забить болт и вставить картинкой, раз дизайнеру похрен, то почему должно быть не похрен тебе?
    4. Извратиться нарисовав стрелку с помощью css.
    Ответ написан
    Комментировать