Ответы пользователя по тегу JavaScript
  • Какой метод массива более затратный forEach или reduce?

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

    @vladdimir
    Верстальщик
    Правильно - очень неопределенное понятие. Если смотреть буквально, то если ваш код работает, он написан правильно. Был бы написан не правильно - не работал бы.

    Если вас интересуют варианты рефакторинга, то можно сделать код более универсальным.
    У вас сейчас все привязано железно привязано к конкретным элементам, захотите, например, сделать тогглер для другого меню и придется опять писать этот код. А это излишне, ведь логика будет повторятся: при клике на кнопку, показать или скрыть какой-то элемент.
    Можете попробовать разделить логику и элементы. Начать можно с того, чтобы передавать в menuToggle элемент аргументом. Либо, сделать меню отдельным независимым компонентом.
    В общем можете переписать код в функциональном стиле или в ООП.

    Еще как вариант, можно не вешать обработчики на каждый пункт меню, а воспользоваться паттерном делегирование событий.

    Про цикл уже выше писали, соглашусь: вместо императивного for, мне больше нравится декларативные встроенные методы.
    Ответ написан
    Комментировать
  • Почему ананимная функция работает, а обычная нет?

    @vladdimir
    Верстальщик
    Потому что вы ее вызываете и у вас в onClick лежит результат ее вызова, а не сама функция.
    $("#mp_button_" + un_id).click(add_mp_data_run());
    Вот так кладите
    $("#mp_button_" + un_id).click(add_mp_data_run);
    Ответ написан
    Комментировать
  • Как реализовать навигацию без мышки?

    @vladdimir
    Верстальщик
    a11yproject.com/posts/navigate-using-just-your-keyboard
    Вот тут близко к вашей теме.
    А как-то двигать курсор напрямую и кода в рамках браузера, нельзя.
    Можно попробовать скрыть настоящий курсор, создать блок-курсор, повесить на страницу слушатели событий и по этим событиям двигать этот блок как настоящий курсор.
    index.html
    <div class="custom-cursor"> </div>


    style.css
    body {
    cursor: none;
    }
    .custom-cursor {
    // стили кастомного курсора
    }


    scripts.js
    class CustomCursor { ... } 
    // реализация поведения кастомного курсора. Должен уметь, наводиться на 
    //другие элементы (hover), кликать и перемещаться по странице.
    Ответ написан
  • Event в function()?

    @vladdimir
    Верстальщик
    Подписываясь на событие, вы вешаете коллбэк. Когда событие срабатывает, в коллбэк передается объект Event с информацией о этом событии. И ev нужен для того, чтобы получить доступ к этому объекту. Его можно назвать и просто e или evt или handmaidsNotes - как хочется, но лучше все таки называть, как принятно, чтобы другим, и вам через пару месяцев, было очевидно, что происходит)

    document.addEventListener('click', doSomething)
    // вывести в консоль все аргументы, переданные в функцию
    function doSomething () { console.log(arguments) }
    
    document.addEventListener('click', doSomethingElse)
    // называем event по другому, чтобы всех запутать
    function doSomethingElse (handmaidsNotes ) { console.log(handmaidsNotes ) }


    Если переменную никак не назвать, то в функции к ней доступа не будет (вру, будет через объект всех аргументов функции - но так делать очень плохо и непонятно зачем вообще) и соответственно обратиться вы к нему не сможете.

    Если вашей функции-обработчику не нужно работать с информацией и методами объекта event, то можно аргумент не задавать. Если вам нужно что-то узнать (event.target, mouseCoords) или сделать (event.preventDefault() ) с event, то вы его подписываете в коллбэке, чтобы было очевидно к чему вы обращаетесь.
    Ответ написан
    Комментировать
  • Как применить onmouseup к элементу?

    @vladdimir
    Верстальщик
    mouseup, как и mousemove применяйте не к элементу, а к body или родительскому контейнеру вашего слайда.

    mousemove
    Каждое движение мыши над элементом генерирует это событие.

    mouseup
    Кнопка мыши нажата/отпущена над элементом.
    learn.javascript.ru/mouse-events-basics
    Ответ написан
    Комментировать
  • Как работают эти строчки?

    @vladdimir
    Верстальщик
    Консолька все хорошо объясняет:
    5e176bef801f9080234294.jpeg
    В num кладут значение по ключу объекта. Ключом выступает значение из массива на текущей итерации. Каждое новое значение будет undefined (приводится к false в булевых операциях), потому как ключ еще не создан.
    Далее создается ключ в объекте, если ранее не был создан (значение в массиве не повторялось). И ложится туда 1, если ключ только что создан. Если ключ в объекте есть, то к его значению добавляется 1.
    Все.
    Зачем и почему реализовано именно так? Ну хз - вопрос к тому, кто это писал.
    Ответ написан
  • Как на js получить предыдущий url, с которого пришел юзер?

    @vladdimir
    Верстальщик
    document.referrer
    Если стоит атрибут, то по идее отдаст пустую строку, так что нет.
    Больше способов не знаю.
    Ответ написан
    Комментировать
  • Как сделать маску для ввода валюты?

    @vladdimir
    Верстальщик
    Для одного только этого можно обойтись и без библиотеки, например так:
    // Функция заменяет число на число с пробелами
    const musk = val => {
        return val
            .toString()
            .split('')
            .map((num, i, arr) => {
              return (arr.length - 1 - i) % 3 === 0 && i !== arr.length - 1
                ? num + ' '
                : num
            })
            .join('')
    }
    //  меняет значение формы на отформатированное значение
    const inpHandler = function() {
      return this.value = musk(this.value)
    }
    
    // вешаем обработчик
    input.addEventListener('input', inpHandler)
    
    //Консольные тесты
    const testValue = {value: 10000, inpHandler: inpHandler}
    console.log(testValue.inpHandler())
    console.log(musk(1000))
    console.log(musk(10000))
    console.log(musk(100000))
    Ответ написан
    Комментировать
  • Почему выводиться 10 раз 10?

    @vladdimir
    Верстальщик
    Таймеры работают асинхронно. Цикл выполняется до того, как срабатывает первый таймер и переменная уже изменена.

    А вот если вызывать таймер через стрелочную функцию:
    ... setTimeout(() => { ...
    то в консоль выведется последовательно 1-10. Почему? Потому как стрелочные функции не имеют собственного контекста выполнения, каждый раз, вызываясь, они ориентируются на контекст блока выше, в данном случае самой функции setTimeout, которая уже выполняется в рамках текущих итераций цикла. То есть, в каждой итерации в момент обращения.
    Стало немного яснее или еще больше запутал?
    Или может я сам неправильно понимаю?))
    Ответ написан
  • В каком порядке это учить?

    @vladdimir
    Верстальщик
    Вот если конкретно по вашему списку, довольно просто распутаться, привожу алгоритм.

    1. Вникнуть в определения технологий в общих чертах. Ответить себе на вопросы: что это? для чего это?
    Например, json - это формат представления данных.
    А npm и yarn - менеджеры пакетов. Бабель, вебпак и галп без одного них не установишь, нужно будет хотя бы установить, узнать основы синтаксиса и распространенные команды.
    Учить все-все команды и глубоко залезать в тему можно, но зачем вам это сейчас? Нужно ли вам вот прям сейчас знать, как публиковать собственные пакеты?
    Не думаю. А что нужно?
    Наверное, устанавливать и удалять пакеты. Возможно проверять обновления и обновлять, смотреть список установленных. Итого, 5-10 команд/флагов для первого знакомства хватит с головой.

    И так далее. Судя по форме вопроса, вам сейчас из этого вообще ничего не нужно, потому как создается впечатление что о назначении этих инструментов вы не размышляли. У вас в списке: формат данных, два менеджера пакетов, 2 грубо говоря сборщика, 1 js технология и транскомпилятор.

    Сможете понять, что это за штуки -> станет ясно, для чего они вам могут понадобиться и в каком порядке их изучать.
    Самое очевидное: вы просто не сможете установить вебпак или галп без менеджера пакетов, а значит и изучать их не сможете. А еще там node.js нужен для работы - вот вам еще список расширил)

    Дальше: присоединюсь к мнениям выше - ставьте себе задачу (проект) и решайте ее (делайте проект). Внедрите интересующие инструменты и делайте.
    Без практики научиться не получится. Медитировать над инструментами в отрыве от реальности можно до пенсии и ни к чему не прийти, потому как сам инструмент используется для чего-то, и без этого самого чего-то он абсолютно бесполезен и изучать его бессмысленно.
    Ответ написан
  • Как сделать так, чтобы по нажатию на блок менялись background?

    @vladdimir
    Верстальщик
    может dbclick вам нужен?

    если нет, то делайте состояние, вроде как

    let isChange = false
    
    elem.onClick = (evt) => {
      evt.preventDefault();
      
      this.style.backgroundImage: isChange ? 'url-to-img' : ''; 
      // Если true, ставим картинку, если нет, не ставим. Или любая другая логика, которая вам нужна.
      
      isChange = !isChange; // Меняем состояние на обратное, чтобы каждый второй клик менял фон
    }
    Ответ написан
  • Как сделать, чтобы при нажатии на блок выполнялась функция, где из этого блока берётся фон и передаётся в другой блок на JS?

    @vladdimir
    Верстальщик
    Алгоритм
    1. Вешаем обработчик на галерею addEventListener('click', onClickGallery)
    2. пишем функцию onClickGallery.
    Что она должна делать?
    - Если клик по превью, то изменить адрес большого изображения. И добавить индикатор текущего изображения у превью (синяя точка под последней прьвюшкой).
    - Если клик по стрелке, то показать следующее/предыдущее изображение.
    - Если клик по активному изображению или в другом месте, выйти из функции.

    Дал бы готовый код, но мне лень, а вам надеюсь хочется сделать и самому)

    Еще можно оптимизировать, чтобы в превью стояли картинки маленького разрешения, а в большую ставить полномасштабные варианты. Это ускорит загрузку сайта)
    Ответ написан
    4 комментария
  • Как сократить такое условие?

    @vladdimir
    Верстальщик
    Наверное можно и без сравнения с null, ведь условие преобразуется в логический тип, а null в js преобразуется в false:
    if (element.previousSibling) { 
     // ... остальной код Дмитрия Дерепко
    }
    
    // Или без вложенных циклов
    // сначала проверить:  если у элемента нет предшествующего элемента
    if (!element.previousSibling) { 
      return element;  
      // вернуть элемент, чтобы другая функция что-то с ним могла сделать. 
      // Или вернуть false, не суть. Важно просто обработать сценарий, когда элемент 
      // идет первым в родителе. Можно просто выйти из функции.
    }
    // Дальше, если предшественник есть, делаем как в коде Дмитрия
    const targetTags = ['h1', 'h2', ...],
        lowerName = element.previousSibling.nodeName.toLowerCase();
    
    if (!targetTags.includes(lowerName)) { 
      // do samething
    }
    
    // Кстати, можно targetTags передавать сразу аргументом в функцию, чтобы код был чуть 
    // более универсальным.
    function doSomethingEpic(element, targetTargs) {
     // code
    }
    
    const someElem = document.querySelector('.epicElement');
    const tags = ['h1', 'h2', ...],
    doSomethingEpic(someElement, tags);


    Важно: метод includes не поддерживается в IE, полифилл есть на сайте MDN
    Ответ написан
    2 комментария
  • Как реализовать поиск на сайте?

    @vladdimir
    Верстальщик
    Вам логику поиска надо делать или отображение уже готовых результатов, которые получаете от апи?
    Если второе и апи на том же домене, аджакс подойдет. На вскидку, не особо вникая, делал бы как-то так.
    На форму обработчик изменения, который отправляет пользовательский ввод в функцию поиска через аджакс.
    Получаем джейсон-файл с результатами, ставим заголовки в подсказки сразу, а результаты по энтеру и клику на кнопке искать.

    Чтобы делать прям подсказки-подсказки, а не грузить заголовки найденных статей, нужно реализовывать какое-то хранилище поисковых запросов на бекенде, иначе откуда эти самые подсказки брать.
    Ответ написан
    Комментировать