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

    0xD34F
    @0xD34F Куратор тега JavaScript
    Логика такая, при клике на пункт списка, например "About" этот текст оказывался на месте текущего, а текущий в списке.

    Какая дичь. Вы понимаете, что после нескольких кликов порядок пунктов может оказаться полностью изменённым? Пользователь запомнил, что такой-то пункт внизу, ищет там - а нет его, наверх уехал. Может, просто скрывать выбранный пункт?

    Ну а так-то всё просто. Добавьте пунктам какой-нибудь класс, dropdown-menu-item, например. И код в обработчик клика:

    const item = event.target.closest('.dropdown-menu-item');
    if (item) {
      const btn = item.closest('.dropdown').querySelector('.dropdown-toggle');
      [ btn.textContent, item.textContent ] = [ item.textContent, btn.textContent ];
    }
    Ответ написан
    Комментировать
  • Как получить данные формы в виде массива объектов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    JSON.stringify([...this.querySelectorAll('[name]')].map(n => ({
      [n.name]: n.type === 'checkbox' ? n.checked : n.value,
    })))
    Ответ написан
  • Как отсортировать массив объектов по дате?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как получить дату из строки:

    const parseDate = str => new Date(str.split('/').reverse().join('-'));

    Сортируем исходный массив:

    all_orders.sort((a, b) => parseDate(a.order_date) - parseDate(b.order_date));

    Или собираем отсортированный новый:

    const sortedOrders = all_orders
      .map(n => [ n, parseDate(n.order_date) ])
      .sort((a, b) => a[1] - b[1])
      .map(n => n[0]);
    Ответ написан
  • Как игнорировать первые символы строки в RegExp?

    0xD34F
    @0xD34F Куратор тега JavaScript
    str.replace(/(?<=.{2}).(?=.{2})/g, '*')
    
    // или
    
    str.replace(/^(.{2})(.+)(.{2})$/, (m, g1, g2, g3) => g1 + '*'.repeat(g2.length) + g3)
    
    // или
    
    Array.from(str, (n, i) => (i < 2 || i > str.length - 3) ? n : '*').join('')
    Ответ написан
    1 комментарий
  • Как получить объект или массив с месяцами?

    0xD34F
    @0xD34F Куратор тега JavaScript
    [...Array(12)].map((n, i) => new Date(0, i).toLocaleString('en-US', { month: 'long' }))
    Ответ написан
  • Как объединить массив с объектами, чтобы ключи не повторялись?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Object.entries(arr.reduce((acc, n) => {
      const [ k, v ] = Object.entries(n)[0];
      (acc[k] = acc[k] || []).push(...v);
      return acc;
    }, {})).map(n => Object.fromEntries([ n ]))
    Ответ написан
    1 комментарий
  • Как в регулярке обычную скобку выдать за текст?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Пробовал ставить перед скобкой «\» не работает.

    Два раза ставьте. Или замените вызов конструктора литералом.
    Ответ написан
  • Как рекурсивно преобразовать объект в xml?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const createXML = obj => Object
      .entries(obj)
      .map(([ k, v ]) => `<ns1:${k}>${v instanceof Object ? createXML(v) : v}</ns1:${k}>`)
      .join('');

    UPD. Если нужны переносы строк и отступы, то

    const createXML = (obj, tabSize = 2, depth = 0) => {
      const indent = ' '.repeat(tabSize * depth);
      return Object.entries(obj).map(([ k, v ]) =>
        indent +
        `<ns1:${k}>${
          v instanceof Object
            ? `\n${createXML(v, tabSize, depth + 1)}\n${indent}`
            : v
        }</ns1:${k}>`
      ).join('\n');
    };
    Ответ написан
    Комментировать
  • Почему функция, связанная с addEventListener, Не срабатывает больше одного раза?

    0xD34F
    @0xD34F Куратор тега JavaScript
    "Не срабатывает" - это вам так кажется. Будете жать на нужную кнопку - всё сработает. Почему кнопка не та? Потому что при открытии окна вы каждый раз создаёте новое. А querySelector возвращает первый подходящий элемент, так что обработчик закрытия всегда цепляется к кнопке того окна, которое было создано при первом открытии.

    Правильно будет заранее создать окно и при открытии вписывать в него нужные данные; или же, в случае создания заново при каждом открытии, вместо скрытия удалять его. Короче, вместо modal.style.display = "none" делайте modal.remove(), и всё будет окей.
    Ответ написан
    Комментировать
  • Как вынести значение одного из ползунков jQuery UI Range?

    0xD34F
    @0xD34F Куратор тега JavaScript
    slide(e, ui) {
      $(this).find('.value').text(i => ui.values[i]);
    },
    Ответ написан
    1 комментарий
  • Как центрировать карту по координатам маркеров?

    0xD34F
    @0xD34F Куратор тега JavaScript
    <div id="address-list"></div>

    const addressList = document.querySelector('#address-list');
    
    addressList.innerHTML = markersData.map((n, i) => `
      <div class="address-list-item">
        <span data-index="${i}">${n.name}</span>
      </div>
    `).join('');
    
    addressList.addEventListener('click', e => {
      const marker = markersData[e.target.dataset.index];
      if (marker) {
        map.setCenter(new google.maps.LatLng(marker.lat, marker.lng));
      }
    });
    Ответ написан
  • Как сделать подсчет суммы в зависимости от кол-ва выбранных чекбоксов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    <div><label><input type="checkbox" id="xxx">hello, world!!</label></div>
    <div><label><input type="checkbox" id="yyy">fuck the world</label></div>
    <div><label><input type="checkbox" id="zzz">fuck everything</label></div>
    <div>sum: <input id="sum" readonly></div>
    <div>ids: <input id="ids" readonly></div>

    document.addEventListener('change', () => {
      const cb = document.querySelectorAll('input[type="checkbox"]:checked');
      document.querySelector('#sum').value = cb.length * 900;
      document.querySelector('#ids').value = Array.from(cb, n => n.id).join(', ');
    });
    Ответ написан
    Комментировать
  • Как сделать рисование canvas?

    0xD34F
    @0xD34F Куратор тега JavaScript
    А-а-а-а-а-а-а-а-а!!!!!!111111

    ЧТО ЭТО ТАКОЕ??!
    function calcRowAndColumn(coordinates) {
      let currPosition;
      if (coordinates > 0 && coordinates < 4) {
        currPosition = 0;
      }
      if (coordinates > 4 && coordinates < 8) {
        currPosition = 1;
      }
      if (coordinates > 8 && coordinates < 12) {
        currPosition = 2;
      }
      if (coordinates > 12 && coordinates < 16) {
        currPosition = 3;
      }
      if (coordinates > 16 && coordinates < 20) {
        currPosition = 4;
      }
      if (coordinates > 20 && coordinates < 24) {
        currPosition = 5;
      }
      if (coordinates > 24 && coordinates < 28) {
        currPosition = 6;
      }
      if (coordinates > 28 && coordinates < 32) {
        currPosition = 7;
      }
      if (coordinates > 32 && coordinates < 36) {
        currPosition = 8;
      }
      if (coordinates > 36 && coordinates < 40) {
        currPosition = 9;
      }
      if (coordinates > 40 && coordinates < 44) {
        currPosition = 10;
      }
      if (coordinates > 44 && coordinates < 48) {
        currPosition = 11;
      }
      if (coordinates > 48 && coordinates < 52) {
        currPosition = 12;
      }
      if (coordinates > 52 && coordinates < 56) {
        currPosition = 13;
      }
      if (coordinates > 56 && coordinates < 60) {
        currPosition = 14;
      }
      if (coordinates > 60 && coordinates < 64) {
        currPosition = 15;
      }
      if (coordinates > 64 && coordinates < 68) {
        currPosition = 16;
      }
      if (coordinates > 68 && coordinates < 72) {
        currPosition = 17;
      }
      if (coordinates > 72 && coordinates < 76) {
        currPosition = 18;
      }
      if (coordinates > 76 && coordinates < 80) {
        currPosition = 19;
      }
      if (coordinates > 80 && coordinates < 84) {
        currPosition = 20;
      }
      if (coordinates > 84 && coordinates < 88) {
        currPosition = 21;
      }
      if (coordinates > 88 && coordinates < 92) {
        currPosition = 22;
      }
      if (coordinates > 92 && coordinates < 96) {
        currPosition = 23;
      }
      if (coordinates > 96 && coordinates < 100) {
        currPosition = 24;
      }
      if (coordinates > 100 && coordinates < 104) {
        currPosition = 25;
      }
      if (coordinates > 104 && coordinates < 108) {
        currPosition = 26;
      }
      if (coordinates > 108 && coordinates < 112) {
        currPosition = 27;
      }
      if (coordinates > 112 && coordinates < 116) {
        currPosition = 28;
      }
      if (coordinates > 116 && coordinates < 120) {
        currPosition = 29;
      }
      if (coordinates > 120 && coordinates < 124) {
        currPosition = 30;
      }
      if (coordinates > 124 && coordinates < 128) {
        currPosition = 31;
      }
      return currPosition;
    }

    Во-первых, всё это делается в одну строку (функция selectPixel может быть сокращена точно так же):

    const calcRowAndColumn = coord => Math.floor(coord / 4);

    Во-вторых, возьмём, например, следующий кусок:

    if (coordinates > 112 && coordinates < 116) {
      currPosition = 28;
    }
    if (coordinates > 116 && coordinates < 120) {
      currPosition = 29;
    }

    Пусть coordinates равен 116. Чему тогда будет равен currPosition? А ничему, undefined - строгие неравенства, больше-меньше, 116 никак не обрабатывается. И остальные граничные значения, кратные четырём, тоже. Это, если что, причина получаемых вами ошибок - эти undefined вы пытаетесь использовать как индексы многомерного массива.
    Ответ написан
    Комментировать
  • Как сделать чтобы блок не пропадал при наведении?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вам тут не нужен js:

    .div1:hover + .div2,
    .div2:hover {
      display: block;
    }

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

    .show {
      display: block;
    }

    let timeout = null;
    
    function onEnter() {
      clearTimeout(timeout);
      div2.classList.add('show');
    }
    
    function onLeave() {
      timeout = setTimeout(() => div2.classList.remove('show'), 300);
    }
    
    div1.addEventListener('mouseenter', onEnter);
    div2.addEventListener('mouseenter', onEnter);
    
    div1.addEventListener('mouseleave', onLeave);
    div2.addEventListener('mouseleave', onLeave);
    Ответ написан
    7 комментариев
  • Как переписать код js чистого на jquery?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Варианты тут такие:

    1. Погуглить jq аналоги нативных функций или хотя бы на https://youmightnotneedjquery.com/ заглянуть, и переписать самостоятельно
    2. Отправиться на фриланс, заплатить денег
    3. Подождать, пока кто-нибудь тут над вами не сжалится и не напишет код просто так (это я и сам сделаю, но чуть позже, не сегодня)

    UPD.

    $('#myselect').change(function() {
      $('#mydiv').text(`Вес брутто*: ${$(':selected', this).attr('for')} кг`);
    });
    Ответ написан
    Комментировать
  • Как преобразовать объект js в строку get запроса?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const getQueryArray = (obj, path = [], result = []) =>
      Object.entries(obj).reduce((acc, [ k, v ]) => {
        path.push(k);
    
        if (v instanceof Object) {
          getQueryArray(v, path, acc);
        } else {
          acc.push(`${path.map((n, i) => i ? `[${n}]` : n).join('')}=${v}`);
        }
    
        path.pop();
    
        return acc;
      }, result);
    
    const getQueryString = obj => getQueryArray(obj).join('&');

    или

    const getQueryString = (obj, path = '') =>
      Object.entries(obj).reduce((acc, [ k, v ]) => (
        path && (k = `${path}[${k}]`),
        acc + (acc && '&') + (v instanceof Object
          ? getQueryString(v, k)
          : `${k}=${v}`
        )
      ), '');
    Ответ написан
  • Чем можно заменить get()?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Проблема не в get, можно ничем его не заменять. При обработке клика вместо первого попавшегося audio надо хватать тот, что соответствует нажатой кнопке (это же касается элементов .play и .pause, с той лишь разницей, что тут вы хватаете всё, что есть), т.е., который находится в том же .container. От кликнутого элемента поднимаемся к .container и ищем внутри него нужные элементы:

    $(document).on('click', '.play, .pause', function() {
      const $this = $(this);
      const $container = $this.closest('.container');
      const isPlay = $this.hasClass('play');
    
      $container.find('.play').toggleClass('active', isPlay);
      $container.find('.pause').toggleClass('active', !isPlay);
      $container.find('audio').get(0)[isPlay ? 'play' : 'pause']();
    });
    Ответ написан
    1 комментарий
  • Как сделать, чтобы при нажатии на кнопку плэй, появлялся значок паузы и играла музыка?

    0xD34F
    @0xD34F Куратор тега JavaScript
    document.querySelector('.music-album').addEventListener('click', e => {
      const { target: t, currentTarget: ct } = e;
      const playButton = ct.querySelector('.play_button');
      const stopButton = ct.querySelector('.stop_button');
      const state =
        playButton.contains(t) ?  true :
        stopButton.contains(t) ? false :
                                  null;
      if (state !== null) {
        ct.querySelector('audio')[state ? 'play' : 'pause']();
        playButton.style.display = state ? 'none' : 'block';
        stopButton.style.display = state ? 'block' : 'none';
      }
    });
    Ответ написан
    1 комментарий
  • Как посчитать сумму значений полей в объекте?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Рекурсия есть:

    const sum = data =>
      (data instanceof Array ? data : [ data ]).reduce((acc, n) => {
        return acc + n.value + sum(n.children || []);
      }, 0);
    
    
    const valueSum = sum(valueList);

    Рекурсии нет:

    function sum(data) {
      let result = 0;
    
      for (const stack = [].concat(data); stack.length;) {
        const { value, children: c } = stack.pop();
        stack.push(...(Array.isArray(c) ? c : []));
        result += value;
      }
    
      return result;
    }
    Ответ написан
    Комментировать
  • Как изменить класс ссылки после заполнения input?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('.wr').on('input', 'input', function() {
      const
        $this = $(this),
        val = $this.val(),
        $link = $this.closest('.item').find('.link-a');
    
      $link.toggleClass('success', /* здесь проверяете, что val какой надо */);
    });
    Ответ написан
    4 комментария