Задать вопрос
Ответы пользователя по тегу JavaScript
  • Почему корень в 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
    Ответ написан
  • Как вывести два поля 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()
    Ответ написан
    Комментировать
  • Как разбить одномерный массив на двумерный из строки?

    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>
    Ответ написан
    Комментировать
  • Автослайдер на 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;
    Ответ написан
    Комментировать
  • Не срабатывает событие закрытия окна в Сафари и не отображаются картинки 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 комментарий
  • Почему возникает ошибка Cannot set property 'onchange' of null?

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

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

    document.addEventListener(‘DOMContentLoded’, _ => {
        // ваш код
    });
    Ответ написан
  • Некорректная работа input на iphone, как исправить?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Поэкспериментируйте со свойствами

    ***-user-select

    в ваших стилях. Попробуйте отключить их совсем, потом постепенно включать и смотреть, работает или нет.
    На айфоне действительно элементы ведут себя как написано, хотя в режиме эмуляции Chrome все работает нормально. Также, на Андроид-устройстве проблем нет.
    Вроде бы такая особенность проявляется на Apple-устройствах.
    Ответ написан
  • Как собрать json?

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

    Вы можете сделать что-то вроде:

    const cartItems = [...document.querySelectorAll(‘cartitem’)];
    
    // затем собрать их в новый массив:
    const items =[];
    cartItems.forEach(cartItem => {
      const newItem = {
        name: cartItem.textContent
      };
      items.push(newItem);
    })
    
    // после чего конвертировать в json:
    
    const itemsJson = JSON.stringify(items);
    Ответ написан
    1 комментарий
  • Якорь работает только в открытом табе на текущей странице. Как сделать чтобы отправлял из всех табов?

    AlexanderK-A
    @AlexanderK-A
    UTC+10
    Попробуйте использовать на целевом элементе метод scrollIntoView.
    Другой вариант (после открытия вкладки):
    windows.location = ‘#example-panels’
    Ответ написан
    Комментировать
  • Почему не срабатывает JS в visual code?

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

    Не видно, чтобы ваша html-страница ссылалась на js-файл:
    <script src="path/to/script.js"></script>

    Видимо, codepen делает это автоматически.
    Ответ написан