Ответы пользователя по тегу JavaScript
  • Как заставить phpstorm видеть alias vite js scss?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Я не заморачиваюсь, просто создаю отдельный файл, типа webpack.config.IDE.js (название любое, пофиг), в нем прописываю алиасы в формате конфига webpack и скармливаю этот файл IDE. Файл этот в коде не используется, исключительно для шторма. Нормально работает.
    653214300813e849679103.png
    содержимое webpack.config.IDE.js
    /*
     * Этот файл НЕ используется в сборке.
     * Он нужен только для корректного автокомплита в IDE phpStorm.
     * Эта IDE почему-то не работает как следует, при указании реально использующегося
     * файла концигурации, расположенного не в корне проекта (node_modules/laravel-mix/setup/webpack.config.js)
     */
    
    const path = require('path');
    
    module.exports = {
      resolve: {
        extensions: ['*', '.wasm', '.mjs', '.js', '.jsx', '.json', '.vue'],
        alias: {
          'vue$': 'vue/dist/vue.runtime.esm.js',
          '@': path.join(__dirname, 'src'),
        },
      },
    };

    Файл был создан давно для вебпака, но и с Vite прекрасно работает. Собственно его функция всего лишь разрешить алиасы в пути в IDE
    Ответ написан
  • Почему переменная класса становится undefined при обращении из метода?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    судя по переменной e могу предположить, что это обработчик события.

    import { TMyClass } from './TMyClass';
    
    const obj = new TMyClass;
    
    addEventListener('click', obj.MyFunc.bind(obj))
    
    или 
    
    addEventListener('click', e => obj.MyFunc(e))
    Ответ написан
    Комментировать
  • Как сделать проще. компактней код?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    <div class="hiking__about_item_img">
      <img class="img1" src="img/about_hiking/1.png" alt="House and mountains in the background">
      <img class="img2" src="img/about_hiking/2.png" alt="Snowy mountains">
    </div>

    .hiking__about_item_img:not(.toggled) .img2,
    .hiking__about_item_img.toggled .img1 {
        display: none;
    }

    document.querySelector('.hiking__about_item_img')?.addEventListener('click', e => {
        e.currentTarget.classList.toggle('toggled');
    });
    Ответ написан
    Комментировать
  • Почему в toLowerCase( ) нельзя вложить что-то на подобие includes(var)?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Даже не знаю с чего начать...
    Ну начну с определений объектов Number и String (сами почитаете).

    У объектов есть методы, объекты можно вызывать как функции.
    Первый пример
    Number(Math.pow(2, 4));
    Здесь мы имеем два объекта Number и Math. У объекта Math вызывается метод pow, который возвращает некое значение. Это значение передается в качестве параметра в Number, вызываемый как функция для приведения переданного значения к числу.
    То есть Number() ожидает параметр, и мы его туда передаем.

    Второй пример.
    str.toLowerCase().includes(s);
    Здесь вы имеем объект String (строка в переменной str). У этого объекта куча методов, которые можно использовать. Здесь вызывается метод toLowerCase(). Этот метод НЕ принимает никаких параметров (смотрите документацию) и возвращает новый объект String. Затем у этого нового объекта String вызывается еще один метод includes(s)
    Ответ написан
    Комментировать
  • Как написать условие для input, чтобы он проверял ввод корректной даты?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Получить строку даты из input.value
    Привести ее к виду YYYY-MM-DD
    Вызвать Date.parse(value)
    Если результат NaN, значит дата не корректная

    Далее можно получить объект даты new Date( Date.parse(value) ) и работать с ним для дополнительных проверок. Например, если какие-то дни под запретом, дата из прошлого или слишком далекого будущего, и т.п.
    Ответ написан
    Комментировать
  • Нужно при клике на '.item__dscr' добавлялся класс '.item__dscr-active' и '.rating' добавлялся класс '.active'?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    const dscrs = document.querySelectorAll('.item__wrapper');
    const ratings = document.querySelectorAll('.rating');
    
    dscrs.forEach((wrapper) => {
            let dsrc = wrapper.querySelector('.item__dscr');
            let rating = wrapper.querySelector('.rating');
    
            dscr.addEventListener('click', function(e) {
                dscr.classList.toggle('item__dscr-active');
                let active = dscr.classList.contains('item__dscr-active');
             
                ratings.forEach(r => r.classList.remove('active'));
                rating.classList.toggle('active', active);
            })
    })
    Ответ написан
    4 комментария
  • Почему textarea изменяет длину строки?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    -teaxtarea{
    +textarea{
        margin:0;
        padding: 0;
        display: block;
      }
    Ответ написан
    Комментировать
  • Как гарантировано получить float 2 знака после точки?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Комментировать
  • Как переписать код c jquery на js?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Ответ написан
    Комментировать
  • Canvas без position fixed? Можно ли?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Он так размещен только для того, чтобы оставаться в поле зрения, так как анимация проигрывается в соответствии со скроллом всей страницы. И это логично, иначе как вы увидите анимацию, когда этот элемент проскроллится за пределы экрана.
    Если вы хотите проигрывать анимацию только ползунком, то и фиксированное положение вам не требуется.
    Ответ написан
    Комментировать
  • Как сделать чтобы на последнем постере слайдер останавливался и не двигался дальше?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Посчитайте максимально возможное смещение. Оно будет равным суме ширин все слайдов и промежутков между ними, минус ширина контейнера слайдера.
    Если текущее смещение (-currentIndex * 220) будет превышать максимальное, то не применять его.
    Ответ написан
    Комментировать
  • Как сделать так чтобы при клике на p внутри div кликалась только div в JS?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Это сделает параграф невидимым для мышки
    div p {
      pointer-events: none;
    }


    А так вы можете определить по какому элементу сделан клик

    document.querySelector('div').addEventListener('click', e => {
      console.log(e.currentTarget); // Будет див, даже если кликнули на внутренний элемент
    });
    
    document.querySelector('div').addEventListener('click', e => {
      console.log(e.target.closest('div'));
      // Будет НАЙДЕН див, внутри которого, или на нем самом кликнули
    });
    Ответ написан
    Комментировать
  • Как задать или удалить класс конкретному дочернему элементу?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    containers.forEach((el) => {
      el.addEventListener("click", e => {
        e.currentTarget.querySelector('.element-3').classList.add('active');
      });
    });
    Ответ написан
    Комментировать
  • Как передать значение 0 из чекбокса?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    <input type="hidden" name="e_sale" value="0">
    <input type="checkbox" id="e_sale" name="e_sale" value="1">


    Если чекбокс выбран, будет передано 1.
    Если нет, то из чекбокса ничего не будет передано, но так как есть инпут с таким же именем, то будет передано его значение, то есть 0.
    последовательность инпутов в разметке важна.
    Ответ написан
  • Как вынести переменную из функции?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    function run(cb) {
         directionsService.route(route,
             function(response) {
                    // ...
                    let distKm = parseInt(dist / 1000);
                    cb(distKm);
                  }
        });
    }
    
    run(function(result){
      console.log(result);
    })


    с учетом ваших комментов:

    document.getElementById('btn-next').onclick = () => {
      run(function(result){
        console.log(result);
      })
    };
    Ответ написан
    1 комментарий
  • Как получать каждые 12 элементов из массива?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    let array = [1,2,3,4,5,6,7,8,9,10,11]
    const chunkSize = 3;
    let chunks = [];
    
    while (array.length > 0) {
      chunks.push( array.splice(0, chunkSize) );
    }
    
    console.log(chunks);
    Ответ написан
    Комментировать
  • Как сделать ограничения кликов по времени?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Вы можете использовать любое хранилище - БД, куки, локальное хранилище, сессию.
    Куки и localstorage в принципе можно поправить или вовсе очистить средствами браузера.
    БД или php-сессия в этом смысле более надежна.

    А сам принцип один, вне зависимости от того, какое хранилище вы будете использовать.
    1. Клик
    2. Проверить, сохранено ли время предыдущего клика
    3.1. Если нет, то разрешить голосование. И сохранить время.
    3.2. Если да, то проверить время.
    3.2.1. Если прошло достаточно, разрешить голосование и сохранить время
    3.2.2. Если нет, ничего не делать или сообщить пользователю, что он слишком увлекся.
    Ответ написан
    Комментировать
  • Как повесить событие, чтобы оно сработало на динамически созданном объекте?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    у вас неточность. в примере на jquery вы просто ловите событие
    а в примере на ваниле хотите инициализировать плагин.

    Это разные вещи.

    Поймать событие просто. Вешайте обработчик на document и смотритте что прилетело в event.target

    В случае с плагином, если он сам не поддерживает инициализацию на созданных в рантайме элементах, вам придется самостоятельно отслеживать появление новых узлов в DOM и по условиям инитить на них плагин. Но это в общем случае, для универсальности. В частном случае можно вклинится в процедуры открытия тех же попапов и там подключать маску. Например напрямую в клике кнопки "Открыть попап", или удобнее, в обработчике события "popup.opened" (условно, я не знаю, какие попапы у вас используются, но у большинства плагинов есть события открытия/закрытия).
    Ответ написан
    Комментировать
  • Как получить координаты элемента относительно его родителя?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    что то вы гоните

    https://api.jquery.com/position/
    .position()

    Description: Get the current coordinates of the first element in the set of matched elements, relative to the offset parent.
    Ответ написан
    1 комментарий
  • Как вывести сумму двух текстовых полей?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Это базовые особенности языка. Объясняются в любом учебнике.
    В джаваскрипт оператор "+" является двойственным. В зависимости от ситуации он может быть как оператором сложения (чисел), так и оператором конкатенации (склеивание строк).

    Здесь оба операнда являются строками, поэтому знак плюс будет оператором конкатенации.
    let s1 = '1';
    let s2 = '2';
    console.log(s1 + s2); // '12'


    Здесь оба операнда являются числами, поэтому знак плюс будет оператором сложения.
    let n1 = 1;
    let n2 = 2;
    console.log(n1 + n2); // 3


    Могут быть ситуации, когда один из операндов будет числом, а другой – строкой.
    В этом случае числовой операнд будет преобразован в строку
    let s1 = '1';
    let n2 = 2;
    console.log(s1 + n2); // '12'


    Когда вы получаете значения инпутов со страницы, они всегда будут строчного типа, во всех ситуациях. Поэтому, прежде чем выполнять над этими значениями математические операции, их нужно преобразовать в числа
    parseInt() - в целое число
    parseFloat() - в число с плавающей точкой
    Number() - можно еще так
    +n2 - или так (это уже своего рода хак, основанный на приведении типов)

    Number(element1.innerHTML) + Number(element2.innerHTML)


    Все подробности здесь https://learn.javascript.ru
    Ответ написан
    Комментировать