Ответы пользователя по тегу JavaScript
  • Можно ли проверить было ли уже событие window.onload?

    Elaryks
    @Elaryks
    Можно через document.readyState проверить состояние страницы:

    if (document.readyState === 'complete') {
       someFunction();
    } else {
       window.addEventListener('load', someFunction);
    }
    Ответ написан
    1 комментарий
  • Как генерируется secret у приложения Vue?

    Elaryks
    @Elaryks
    В исходном коде есть обфусцированный участок, выглядящий примерно так:

    Обфусцированный код
    self[_=String.fromCharCode,p=parseInt,_(p(211,6)+false+p(30,0x6))+_(169-57)+_(p(104,5)+p(301,0x5))+_(p(1,7)+false+p(145,0x7))+_(101)+_(46+false+53)+_(/*_(72)*/)+_(/*_(16)*/)+_(/*_(15)*/)+_(1938/**\/*//17)+_(p(14142,6)/**\/*//p(34,0x6))+_(46+70)] = (_=String.fromCharCode,p=parseInt,_(p(312,4)+p(201,0x4))+_(/*_(87)*/)+
    []
    +_(/*_(62)*/)+_(85)+_(1620/18)+_(p(330,5)-p(2,0x5))+_(77)+_(52+false+18)+
    []
    +
    []
    +_(/*_(62)*/)+_(/*_(83)*/)+_(82)+_(77)+
    []
    +_(p(141,5)+p(111,0x5))+_(81)+_(1830/30)+_(61));

    И его слегка упрощённый вариант
    self[
      ((_ = String.fromCharCode),
      (p = parseInt),
      _(p(211, 6) + false + p(30, 6)) +
        _(112) +
        _(p(104, 5) + p(301, 5)) +
        _(p(1, 7) + false + p(145, 7)) +
        _(101) +
        _(46 + false + 53) +
        _(114) +
        _(p(14142, 6) / p(34, 6)) +
        _(116))
    ] =
      ((_ = String.fromCharCode),
      (p = parseInt),
        _(p(152, 7)) +
        _(48) +
        _(p(1032, 4)) +
        _(p(24003, 7) / p(131, 7)) +
        _(p(2002, 4) - p(310, 4)) +
        _(p(256, 7) - p(126, 7)) +
        _(66) +
        _(76) +
        _(p(152, 7)) +
        _(62 + false + 3) +
        _(p(-2, 4) + false + p(333, 4)) +
        _(61));

    В нём self['apiSecret'] присваивается определённое значение (self в данном случае — экземпляр Vue). При этом какой-то динамики я там не вижу, но, вероятно, эта часть кода генерируется на сервере. Вытащить ключ можно, выполнив в консоли вторую часть кода из исходника (после знака "="), либо просто взяв из экземпляра Vue: document.getElementById('app').__vue__.apiSecret. После нужно эту строку декодировать через atob():

    atob(document.getElementById('app').__vue__.apiSecret);
    Ответ написан
    2 комментария
  • Как корректно посчитать разницу в moment js?

    Elaryks
    @Elaryks
    Мало работал с Moment.js, но, вероятно, ошибка в том, что serverAndUserTimeDifference — разница в миллисекундах между датами, а при пробросе её в moment() она считается как дата в UNIX-формате.

    Вот примерный код, который работает:
    const now = moment();
    const serverTime = moment('2024-10-09 10:20:34.987');
    const duration = moment.duration(Math.abs(now.diff(serverTime)));
    const result = `${duration.days()} ${duration.hours().toString().padStart(2, '0')}:${duration.minutes().toString().padStart(2, '0')}:${duration.seconds().toString().padStart(2, '0')}`;
    Ответ написан
    Комментировать
  • Чем реализовать просмотри изображения на 360 градусов в ограниченном блоке?

    Elaryks
    @Elaryks
    Судя по исходному коду, там используется Pannellum.js.
    Ответ написан
    Комментировать
  • Как проверить соответствует ли value of input формату "фамилия имя отчество "?

    Elaryks
    @Elaryks
    Можно сразу удалить в строке лишние пробелы в начале и конце, после чего разбить её по пробелам:

    const nameParts = name.trim().split(/\s+/);
    if (nameParts.length !== 3) {
        errorDispatching('Введите фамилию, имя, отчество');
        return;
    }
    Ответ написан
    Комментировать
  • Как предотвратить имитацию запросов?

    Elaryks
    @Elaryks
    Да, сымитировать запрос можно. Поэтому есть правило: "Нельзя доверять данным, которые приходят с клиента". Следовательно, данные с клиента нужно проверять на сервере. Критические данные и операции нужно подписывать или хэшировать, чтобы избежать подмены. Например, для защиты от Replay Attack используют одноразовые токены — при повторном запросе токен уже не сработает.
    Ответ написан
    4 комментария
  • Почему не работает код с touchSwipe?

    Elaryks
    @Elaryks
    В коде несколько проблем:
    1. Вы одновременно загружаете три разных версии jQuery. Это не очень хорошо. При этом что-то грузится с CDN, что-то — из проекта.
    2. jQuery нужно загрузить первой, т. к. плагин для свайпа её использует. И убедитесь, что сам файл плагина touchSwipe у вас есть в проекте.
    3. Точка с запятой и "px" не нужны после threshold.


    Вот рабочий пример (в нём jQuery и touchSwipe загружаются из CDN):

    Ответ написан
  • Как обратиться к объекту с параметром имея его название в виде строки?

    Elaryks
    @Elaryks
    Аналогичная функция есть в lodash. Можете взять из исходников или найти какую-либо другую реализацию. Что-нибудь такое:

    const getPropByPath = (object, path) => {
        const _path = Array.isArray(path) ?
            path :
            path.split('.');
        if (object && _path.length) return getPropByPath(object[_path.shift()], _path);
        return object;
    };
    
    const obj = {
        a: {
            b: 1,
            c: {
                d: 2
            }
        }
    }
    
    getPropByPath(obj, 'a.b'); // 1
    getPropByPath(obj, 'a.c.d'); // 2
    getPropByPath(obj, 'a.c'); // { d: 2 }
    Ответ написан
    1 комментарий
  • Как показать, сколько прошло с определенного времени/даты?

    Elaryks
    @Elaryks
    Например, можно воспользоваться вариантом отсюда:
    function timeAgo(input) {
        const date = (input instanceof Date) ? input : new Date(input);
        const formatter = new Intl.RelativeTimeFormat('ru');
        const ranges = {
            years: 3600 * 24 * 365,
            months: 3600 * 24 * 30,
            weeks: 3600 * 24 * 7,
            days: 3600 * 24,
            hours: 3600,
            minutes: 60,
            seconds: 1
        };
        const secondsElapsed = (date.getTime() - Date.now()) / 1000;
    
        for (let key in ranges) {
            if (ranges[key] < Math.abs(secondsElapsed)) {
                const delta = secondsElapsed / ranges[key];
                return formatter.format(Math.round(delta), key);
            }
        }
    }


    Либо можно использовать библиотеки: метод from из Day.js, javascript-time-ago или timeago.js.
    Ответ написан
  • Почему яндекс метрика(эллектронная коммерция) выдает ошибку при отправке данных js?

    Elaryks
    @Elaryks
    Судя по ошибке, window.dataLayer === undefined (не существует). По информации из Яндекс Справки, при инициализации метрики нужно инициализировать window.dataLayer:

    <script type="text/javascript">
        // Инициализация кода счетчика
        ym(XXXXXX, 'init', {
            ...
            // Если настройка ecommerce включена при инициализации, то контейнером данных всегда будет window.dataLayer
            // Если настройка включена через интерфейс, то название можно изменить в настройках счетчика 
            ecommerce: true
            ...
        });
        // Контейнер данных (JavaScript-массив) в глобальном пространстве имен (window)
        window.dataLayer = window.dataLayer || [];
    </script>


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

    Elaryks
    @Elaryks
    В вашем методе disabledOs свойство children у элементов не меняется, т. к. метод map не мутирует переданный в него массив, а возвращает новый.

    disabledOs() {
        const modifyElement = (el, isDisabled) => {
            return {
                ...el,
                ...(el.children && {
                    children: el.children.map(c => modifyElement(c, isDisabled)),
                }),
                disabled: isDisabled,
            };
        };
    
        return this.form.os.map(el => {
            const isDisabled = !this.form.device_types.includes(el.device_type_id);
    
            return modifyElement(el, isDisabled);
        });
    };
    Ответ написан
    Комментировать
  • Как заставить gradient svg не дергаться при уменьшении и при увелечение?

    Elaryks
    @Elaryks
    В целом, нечто подобное можно сделать без использования JavaScript:

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

    Elaryks
    @Elaryks
    Картинки переключаются (это видно, если убрать overflow: hidden у .card-list). Просто они расположены в столбик, который ограничен по высоте, при этом неактивные карточки занимают своё положение в документе даже при opacity: 0. Вероятно, вы где-то пропустили часть логики или стилей, чтобы первая картинка заменялась на активную картинку. Поскольку у карточек в вашем примере размеры одинаковые, достаточно заменить position: relative на position: absolute у .card.
    Ответ написан
    1 комментарий
  • Почему не выводится alert?

    Elaryks
    @Elaryks
    У DOM-элемента может быть только одно свойство onclick. Вы перезаписываете его через document.getElementById("clearButton").onclick на сброс значения поля ввода.

    Вы можете либо объединить код в одну функцию, либо использовать addEventListener, который позволяет вешать несколько обработчиков на одно событие:

    const buttonEl = document.getElementById("clearButton");
    
    buttonEl.addEventListener("click", () => {
      // Необходимый код 1
    });
    
    buttonEl.addEventListener("click", () => {
      // Необходимый код 2
    });
    Ответ написан
    Комментировать
  • Почему InputMaska не позволяет вводить номер телефона?

    Elaryks
    @Elaryks
    Судя по документации, маска должна выглядеть примерно так:

    const telMask = new Inputmask('+11 (999) 999-99-99');
    Ответ написан
  • Почему не выводятся данные в скрипте?

    Elaryks
    @Elaryks
    В коде используется свойство factor у полей ввода, но оно не определено.
    Можно, например, сделать так: <input data-factor="1" />, после чего получить значение в JS через form.elements[i].dataset.factor.
    Кроме того, нет свойства form.count. Можно сделать что-то вроде form.querySelectorAll('input[data-factor]').length
    Ответ написан
    Комментировать