• Почему корень в JS это null, а не Object.prototype?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    А вообще ваш вопрос немного интереснее, чем кажется на первый взгляд).

    Спецификация ES описывает и значение null, и тип Null:


    null & Null
    4.4.15 null value
    primitive value that represents the intentional absence of any object value

    4.4.16 Null type
    type whose sole value is the null value


    То есть в логике спецификации вывод

    console.log(Object.getPrototypeOf(Object.prototype));
    // выводит null


    Следует читать не как "прототип объекта Object.prototype - это/равен null", а "у объекта Object.prototype прототип отсутствует (намеренно не задан)".
    Ответ написан
    3 комментария
  • Как сделать центрирование кнопки смещая скролл по нажатию на эту кнопку?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Честно говоря, не очень понятна задача, которую вы решаете.
    Если я правильно понял написанное, то прокрутка не должна работать так, как вы пишете - с дополнительным смещением элементов в начале или в конце.

    https://developer.mozilla.org/en-US/docs/Web/API/E...

    В русской версии:


    scrollLeft может быть установлен, как любое целое число, однако:

    Если элемент не может быть прокручен (т.е. у него нет переполнения), scrollLeft устанавливается в 0.
    Если установили значение меньше 0 (больше 0 при расположении элементов справа налево), scrollLeft устанавливается в 0.
    Если установлено значение больше, чем максимум прокручиваемого контента, scrollLeft устанавливается в максимум.


    Может быть вам стоит добавить в начале и в конце какой-нибудь скрытый элемент, который будет менять размеры в зависимости от того, какой элемент (кнопка) должна быть в центре - чтоб отталкивать от границ контейнера первый и последний элемент.

    Вот это:
    justify-content: center;

    по-моему, там не нужно.

    P.S. Для более быстрого отклика при разборе простых случаев, полезно так же освоить codepen и т.п.

    Вот, к примеру, демка для вашего вопроса:
    https://codepen.io/alkthecode/pen/ZENWGRZ
    Ответ написан
  • Почему не добавляются поля в коллекцию mongodb?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Доброго дня!
    Насколько я помню mongo и судя по вашему коду, ничего никуда добавляться и не должно
    Вы просто описываете модель данных в коде, но ничего в БД не записываете.

    Попробуйте, эксперимента ради, при запуске сервера обновить/добавить какой-нибудь документ в коллекцию admin.
    Ответ написан
    1 комментарий
  • Как передать токен пользователя между двумя frontend приложениями?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Доброго дня!

    В не зависимости от используемого фронтового фреймворка/библиотеки - если у вас приложения на одном хосте, и токен передается от бэка на фронт в серверном ответе (не в куки), то самое простое - сохранять access и refresh токены в локальном хранилище браузера (localStorage).

    Потом в приложениях, которые предполагают общую авторизацию - извлекать токены из одного и того же ключа хранилища.

    Для большей реактивности можно еще обмениваться данными авторизации (вход/выход) через механизм window.postMessage()
    Ответ написан
    1 комментарий
  • Как вывести два поля input при определенном option в select в определенном элементе?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    У вас в шаблонизаторе создаётся много html-элементов с одинаковыми id, а это плохо - что и видно как раз на примере вашего обработчика.
    Соответственно, вызов :

    const ifCall = document.getElementById('ifCall')

    Возвращает первый найденный div#ifCall.
    Можно добавлять в атрибут id внутри цикла - текущий индекс цикла: ifCall_1.
    А для упрощения связывания элементов в одной «группе» - указывать индекс в атрибуте dataSet:

    <select id =“status_1” data-group-id=“1”>…</select>
    <div id =“ifCall_1” class=“if-call” data-group-id=“1”>…</div>


    У всех ifCall теперь один css-класс - это и правильно, и хорошо.

    В js коде извлечь индекс группы можно в поле dataSet элемента:

    const groupId = select.dataSet.groupId

    Соответственно, искать элемент

    querySelector(‘.if-call[data-group-id=${groupId}]’)
    Ответ написан
    Комментировать
  • Как удалить элемент из массива в local storage по его индексу?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Извлечь из localstorage значение -> преобразовать из строки в массив JSON.parse() -> сделать что надо с массивом -> сохранить в localstorage JSON.stringify()
    Ответ написан
    Комментировать
  • Почему не отправляется Refresh Token на сервер?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Встречный вопрос, если позволите - из спортивного интереса)

    У вас авторизация построена по схеме токены + куки в сессиях?
    Мне интересны возможные реализации - опирались на какие-нибудь готовые методики или сами все придумывали?
    Ответ написан
  • Как в VS Code отключить подтверждение "Завершить выполнение пакетного файла"?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Это особенность не VS Code, а терминала Windows.
    Надо смотреть, есть ли там какие-то настройки для этого.
    Ответ написан
    Комментировать
  • Как разбить одномерный массив на двумерный из строки?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Доброго дня!
    Предложил бы более обобщенный вариант по типу "группировка элементов по N штук" из текстовой строки.

    На выходе получается нормализованный массив строковых элементов, которые потом можно преобразовывать, например, в число и т.д. Размер группы (сколько элементов во вложенных) массивах - задается параметром groupSize.

    (()=>{
        const source = '[3, 2, 1, 0, 5, 6, 4, 0, 1, 5, 3, 0, 2, 2, 2, 0]';
        
        // тест
        console.log(groupItems(source));
        
        function groupItems(source, groupSize = 3){
            return (
                (source??'')
                    .trim()
                    .replace('[', '').replace(']', '')
                    .split(',')
                    .map(e=>e.trim())
                    .filter(e=>e!=='0')
                    .reduce((arrays, cur, i)=>{
                        if(i % groupSize === 0){
                            return [
                                ...arrays,
                                [cur]
                            ];
                        } else{
                            return [
                                ...arrays.slice(0, arrays.length-1),
                                [...arrays.at(-1), cur]
                            ];
                        }
                    }, [])
            );        
        }
    })()
    Ответ написан
    Комментировать
  • Как сделать, чтобы встроенный обработчик события убрал сам себя?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Доброго дня!

    Если я правильно понимаю вопрос, то вы можете воспользоваться сигналом остановки - AbortSignal при назначении обработчика события, например:

    <DOCTYPE html>
    <html>
    <head></head>
    <body>
    <button ontouchstart="gg()" onclick="gg()"></button>
    <script>
      const controller = new AbortController();
      const signal = controller.signal;
      const abort = () => controller.abort();
    
      document.querySelector('#btn_103')?.addEventListener('click', () => {
        abort();
        // логика для click
    
      },  { signal } ); // здесь передаем обработчику сигнал остановки
    
      document.querySelector('#btn_103')?.addEventListener('touch', () => {
        abort();
        // логика для touch
    
      },  { signal } ); // здесь передаем обработчику сигнал остановки
    </script>
    </body>
    </html>
    Ответ написан
    Комментировать
  • Как запустить npm view внутри express роута и получить данные в виде JSON?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Добрый день!

    Чтобы получить результат команды в виде JSON, нужно дополнить команду флагом, к примеру:
    npm view --json express
    Ответ написан
    Комментировать
  • Авторизация пользователя node + express?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Доброго дня!

    Видимо, вам нужно возвращать какую-то html-страницу обратно пользователю, и на эту страницу предварительно отрисовывать то, что нужно.
    Для этого можно использовать один из многочисленных шаблонизаторов.

    res.render(viewName, {userData: req.session.user});
    Ответ написан
    Комментировать
  • Автослайдер на JavaScript. Где ошибка в слайдере?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Доброго дня!

    Бросилось в глаза вот это (в паре мест):
    if (n > slides.length) {
    slideIndex = 1
    }
    if (n < 1) {
    slideIndex = slides.length
    }


    В JavaScript допустимые индексы массива - от 0 до someArray.length-1 включительно.

    Может в этом дело?
    Ответ написан
  • В чем ошибка валидации формы?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Доброго дня!

    На мой взгляд, проблема в том, что, например, значения isFioValid из forms.js и valid из fioValidation.js во время выполнения никак не связаны друг с другом.

    Ваша функция
    export function fioValidation() {
      ...
      let valid;
      ...
    }

    в своем теле не устанавливает значение valid, следовательно результатом ее выполнения будет undefined:

    let isFioValid = fioValidation(); // isFioValid === undefined


    После этого при наступлении DOM-события вы меняете эту самую переменную valid, которая живет в замыкании у прослушивателя fio.addEventListener. Но так как это примитивное значение, то изменение этого valid никак не затрагивает значение переменной isFioValid, которой уже присвоено значение undefined.

    В вашем случае сходу можно попробовать возвращать из функции не примитивное значение, а объект:
    let fioValid = {isValid: false, name: ''};
    а потом при наступлении события blur устанавливать нужное значение если все хорошо (или сбрасывать если наоборот):
    fioValid.isValid = true;
    fioValid.name = fio.name;
    Ответ написан
    Комментировать
  • Как я могу использовать импорт es6 в узле?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Добрый день!

    Модули ECMAScript можно использовать в node.js начиная с версии 8.9.0, в версии 12 подсистема модулей ECMAScript была усовершенствована.
    Для экспериментов с модулями ECMAScript в Node.js необходимо запускать node с флагом
    --experimental-modules

    Разработчики планируют сделать эту возможность доступной без флага до октября 2019 года, когда Node.js 12 дойдет до состояния LTS.
    Ответ написан
  • Не срабатывает событие закрытия окна в Сафари и не отображаются картинки svg?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    А вы привяжите отслеживание нажатия не к window, а напрямую к div, на фоне которого рисуется меню:

    bgAdaptiveMenu.addEventListener("click",...)
    Ответ написан
  • Почему this равен undefined?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Доброго дня!

    Чтобы в литерале объекта сохранить this, надо использовать функцию-метод, при этом bind меняем на call:

    $.get({
          ...
          // this === undefined ??
          success(content){
             fetchSuccess.call(this, content, resolve)
          }
          ...
        })
    Ответ написан
    Комментировать
  • Какую библиотеку использовать для REST запросов в JS?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Доброго дня!

    Запросы из браузера к api на сервере называются Ajax-запросы. В каком то смысле это можно назвать RPC.

    Для совершения таких запросов и существуют библиотеки axios, часть библиотеки jQuery и наверное ещё что-то.
    fetch - это современный web api для работы с Ajax-запросами, поэтому стоит освоить этот инструмент и использовать там, где не очень важна совместимость со старыми браузерами.
    Если важна совместимость, используйте axios.
    Ответ написан
    1 комментарий
  • Регулярное выражение для отслеживания строчки в текстовом файле?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Попробуйте вот так:

    toster\.ru.*?\s

    данное выражение должно вернуть строку, начинающуюся с toster.ru и заканчивающуюся пробельным символом (вместе с этим символом).

    Предусматривает, что внутри искомой строки, как вы написали, пробелов нет.
    Ответ написан
  • Почему возникает ошибка Cannot set property 'onchange' of null?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Скорее всего при загрузке страницы скрипт отрабатывает быстрее, чем выстраиваемся структура документа.

    Поместите ваш код в обработчик события загрузки DOM:

    document.addEventListener(‘DOMContentLoded’, _ => {
        // ваш код
    });
    Ответ написан