Ответы пользователя по тегу JavaScript
  • События click и touchstart странное поведение на мобильном, как решить?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Попробуй в css добавить проверку на hover для элемента списка, мобилки часто ловят ховер перед кликом

    @media (hover: hover) {
      .swatch__list--item:hover .swatch__tooltip {
          top: -33px;
          opacity: 1;
          visibility: visible;
      }
    }


    Про медиазапрос hover можно почитать тут - https://developer.mozilla.org/en-US/docs/Web/CSS/@...
    Ответ написан
    Комментировать
  • Поможете разобраться с копированием в JS?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Функция не ждет, вы добавляете к HTML еще один span, а не меняете его на свой.
    Поменяйте += на =
    then(() => {
      elem.innerHTML = '<span class="success"...
    Ответ написан
  • Я так никогда не выучу React. Что это за ошибка?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    В 3 строке компилятор не понял написанной конструкции и предположил, что вы объявили Header как неприсвоенную константу, а после нее анонимная функция, поэтому предположил, что это не наследование, а перечисление констант и предложил поставить запятую после Header, но в вашем случае вы не написали знак присвоения (равно) для константы Header анонимной функции.
    const Header = () => {…}
    Ответ написан
    Комментировать
  • Как сделать чтобы меню гамбургер закрывалось при клике на ссылку и в пустом месте экрана?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Если добавить еще один слушатель событий на документ, то можно закрывать при условии, что меню открыто:

    function closeBurger() {
      if (menu.classList.contains("active")) {
        toggleMenu();
        toggleToggle();
      }
    }
    
    document.addEventListener('click', closeBurger, false);
    Ответ написан
    7 комментариев
  • Как написать js в php файле?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Команда echo не запускает скрипты, она выводит текстом все что в нее всунуто.
    Т.е. максимум, при исправлении ошибок синтаксиса, в вашем примере вы получите код js написанный в виде текста, например на странице или в консоли или где вы запускаете этот php, для того, чтоб код сработал, вам нужно выйти за рамки php , например -

    <?php 
      $kakoyto_php_kod = '100%';
      echo "Hello world, Im php" ;
    ?>
    <script type="text/javascript">
        $(document).mouseup(function () {
            $('.header__burger').click(function (e) {
              e.preventDefault()
              $('.header__nav').toggleClass('header__nav--active')
            })
        })
        $(document).mouseup(function (e) {
            var $target = $(e.target)
            if ($target.closest('.header__menu').length == 0) {
              $('.header__nav').removeClass('header__nav--active')
            }
        })
        </script>
    <?php 
      $ostalnoy_php_kod;
    ?>
    Ответ написан
  • Написал js, но, думаю, тут можно его сократить (оптимизировать)?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Способ определения оставленного комментария на ваше усмотрение, сократить можно так

    const { hash, href } = window.location;
    const urlc = href.replace(hash, '');
    
    if (hash && decodeURIComponent(readCookie('commentadd')) === urlc) {
      alert("Комментарий оставлен");
    }

    или так

    const { hash, href } = window.location;
    
    if (hash && href.includes(decodeURIComponent(readCookie('commentadd')))) {
      alert("Комментарий оставлен");
    }
    Ответ написан
    Комментировать
  • Как отследить количество вводимых символов в поле?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Вы сравниваете длину строки с пустым значением
    Или так
    fieldSearch == ''
    или так
    fieldSearch.length < 1

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

    $('.header__field-search').on('input', function () {
        const fieldValue = $(this).val();
        if(!fieldValue.val().length){
            console.log('0')
            return;
        }
    
        if(fieldValue.length) {
            console.log('больше 1')
            return;
        }
    })
    Ответ написан
  • Почему livereload не работает?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Если я все верно понял, поискав инфу на странице плагина gulp-connect, то релоад смотрит на изменениях в конечном html файле, соответственно его нужно ставить после компиляции/изменения файла в конечной папке
    Ответ написан
    Комментировать
  • Как обнулить значение input для AJAX?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Вообще я не сторонник таких частых запросов на сервер по нажатию каждой кнопки, некоторые вешают таймаут в 2-3 секунды и только потом отправляют.

    У вас перезаписывается значение инпута, нужно его дополнять.

    Замените это
    $('#tags').val($(this).text());

    на это
    $('#tags').val($('#tags').val() + $(this).text());

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

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Для этого вам нужно знать какой из элементов текущий, например элемент с классом cost__elem--current, тогда вы можете вешать на все до него класс --success

    const items = Array.from(document.querySelectorAll('.cost__elem'));
    
    for (let i = 0; i < items.length; i++) {
      if (!items[i].className.includes('cost__elem--current')) {
        items[i].classList.add('cost__elem--success');
      } else {
        return;
      }
    }
    Ответ написан
  • Можно ли сократить и улучшить код?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    document.addEventListener('DOMContentLoaded', () => {
      const policy = document.getElementById('policy');
      const policyReplaced = 'policy_confirm'.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,'\\$1');
      const regExp = new RegExp(`(?:^|;)${policyReplaced}=([^;]*)`);
      const cookie = document.cookie.match(regExp);
    
      if (cookie[1] === 'Y') {
        policy.remove()
        return;
      }
    
      const policy_box = document.querySelector('div.policy-container');
    
      if (policy_box) { 
        return;
      }
    
      const confirmButton = '<a href="javascript:void(0)" class="policy-confirm"><?php echo $text_btn_privacy; ?></a>';
      policy_box.innerHTML = `
        <div class="policy-text">
          <?php echo ${!navigator.cookieEnabled ? '$text_privacy_enabled;' : '$text_privacy;'} ?>
        </div>
        <a href="javascript:void(0)" class="policy-confirm"><?php echo $text_btn_privacy; ?></a>
        ${navigator.cookieEnabled && confirmButton || ''}
      `;
    
      setTimeout(() => {
        policy.appendChild(policy_box);
        policy.classList.add('active');
    
        setTimeout(() => policy.classList.add('activated'), 400);
    
        const policy_confirm = document.querySelector('.policy-confirm');
    
        policy_confirm && policy_confirm.addEventListener('click', () => {
          policy.classList.remove('activated');
          setTimeout(() => policy.remove(), 300);
          document.cookie='policy_confirm=Y; path=/'
        })
      },100)
    })
    Ответ написан
    Комментировать
  • Почему округление до целого числа получается с ошибкой js?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Поменяйте это
    var left = Math.round(newLeft / stepSize) * stepSize;
            console.log('left ' + left);
    
            thumb.style.left = left + 'px';
    
            thumbVal.innerHTML = (left / stepSize) * step;


    На это
    var left = Math.round(newLeft / stepSize) * stepSize;
            console.log('left ' + left);
    
            thumb.style.left = left + 'px';
    
            thumbVal.innerHTML = Math.round(left / stepSize) * step;
    Ответ написан
    1 комментарий
  • Правильное ли удаление из localStorage и сохранение?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Вы перезаписываете значение итема в localStorage на пустой массив, в следующий раз при проверке есть ли такой итем в хранилище вы получите true, и его значение пустой массив, чтоб удалить из хранилища используйте метод removeItem

    localStorage.removeItem(localName)
    Ответ написан
    3 комментария
  • Как обернуть тест в блоке перед символом?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Открываем рубрику ответы на некровопросы

    const replcaeWithSpan = (item, searchWord) => {
      if (!searchWord) return;
    
      item.innerHTML = item.innerText.replace(searchWord, `<span>${searchWord}</span>`);
    }
    
    const item = document.querySelector('.item');
    replcaeWithSpan(item, 'test');
    Ответ написан
    Комментировать
  • Как убрать ошибки?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Ну NaN это очевидно) Not A Number, что указывает о том, что когда вы удаляете все цифры, в вашем инпуте нет ожидаемого числа, пустая строка в инпуте не является числом, лечится value = value.replace(/\D/, 0);

    А удаление - когда вы вводите число в инпут ручками у вас не применяется форматирование, и там остается число, что позволяет легко удалить последний символ у любого числа, когда вы дергаете ползунок, ваши числа магическим образом (нет) становятся строкой вида '1 000', соответственно парсер( parseInt(el.value) ) парсит строку и получает 1 (введите в консоли parseInt('1 000') например), парсер отсекает все после пробела, т.е. по факту он убирает все после символа, который невозможно сделать числом
    Ответ написан
    4 комментария
  • Как приведённые скрипты конфликтуют между собой?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Вы вызываете функцию, а нужно присваивать вызов функции к слушателю событий
    <button class="btn_access func-during" onclick="() => applyFilters()">Подобрать</button>


    или

    <button class="btn_access func-during" onclick="function(){ applyFilters() }">Подобрать</button>


    или

    <button class="btn_access func-during" onclick="applyFilters">Подобрать</button>
    Ответ написан
    Комментировать
  • Как изменить X/Y относительно значения?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Как я понял ты их высотой регулируешь,
    значит нужен скрипт который считает тебе процент от числа

    const values = [25, 0, 23, 52, 0, 32];
    
    // Константа, дефолтное значение, показывающее максимальную высоту твоих столбиков, в пикселах
    const maxHeight = 300;
    const getPixelsFromPercents = (val) => (maxHeight * val / 100) + 'px';
    
    // В цикле где-нибудь запустить и убрать первый индекс
    const styles = {
      height: getPixelsFromPercents(values[0]),
    }
    // Осталось куда-нить прикрутить что получилось


    или так
    const values = [25, 0, 23, 52, 0, 32]; // Массив процентов для графика
    const maxHeight = 300; // Максимальная высота столбца
    const getPixelsFromPercents = (val) => (maxHeight * val / 100) + 'px'; // Функция считающая проценты в пикселах
    const labels = Array.from(document.querySelectorAll('.recharts-text.recharts-label')); // Массив столбиков
    
    labels
      .map((item, index) = > {
        // Каждому столбику присваеваем высоту согласно массиву процентов
        item.style.height = getPixelsFromPercents(values[index]);
      })
    Ответ написан
    Комментировать
  • Массив из массива обьектов используя деструктуризацию и spread?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    А что вы хотите куда спредить и деструктурировать?
    const [...{name:name}] = data;
    Здесь вы пытаетесь создать массив с именем переменной... тут нет имени переменной для массива,
    Но если вы дернете без спреда,
    const [{name: name}] = data;
    то вам вернется значение поля name из первого элемента массива и запишется в переменную name, даже не объект, т.к. в данном случае([{name: name}]) происходит операция присваивания переменной 'name' значением поля 'name' из массива объектов, что на выходе даст строку с первым значением этого поля.

    Вам нужен новый массив с ключами и значениями из другого массива, так? Это делается так -
    const data=[
      {id:1, name:"ganna",age:15},
      {id:2, name:"anna",age:16},
      {id:3, name:"petro",age:54}
    ];
    
    const arr = Object.values(data).map(item => [{ name: item.name }]); // Массив массивов с объектами
    const arr2 = Object.keys(data).map(() => []); // Массив пустых массивов, чтоб можно было пушнуть элементы в 
                                                  // массив. Еще можно так Array.from(data).fill([]);
    
    Object.values(data).map((item, index) => arr2[index].push({ name: item.name }));
    
    console.log(arr);
    //=> [
    //    [{name: 'ganna'}],
    //    [{name: 'anna'}],
    //    [{name: 'petro'}]
    //. ]
    
    console.log(arr2);
    //=> [
    //    {name: 'ganna'},
    //    {name: 'anna'},
    //    {name: 'petro'}
    //. ]
    Ответ написан
    1 комментарий
  • Как остановить фиксированный блок перед футером?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Используйте position: sticky с top: 0 и bottom: 0; js тут не нужен. Для старых браузеров можно поискать полифил в интернетах. Форк вашего кода с решением со стики https://codepen.io/irodger/pen/eYJwxKx

    Кстати, если вы не используете какой-нибудь из css препроцессоров, то эти строчки так не работают
    #aside-fixed {
      width: 150px;
      position: relative;
      height: 100%;
      @media screen and (max-width: 1024px) {
        display: none;
        height: 0;
      }
    }

    В ванильном CSS надо так
    #aside-fixed {
      width: 150px;
      position: relative;
      height: 100%;
    }
    
    @media screen and (max-width: 1024px) {
      #aside-fixed {
        display: none;
        height: 0;
      }
    }
    Ответ написан
  • Почему не работает скрипт JS?

    Raxen
    @Raxen
    TechLead Frontend Developer, Beeline
    Перенесите подключние скрипта из head в body, если скрипт использует jquery, то после jquery
    Ответ написан