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

    0xD34F
    @0xD34F Куратор тега JavaScript
    О каких label'ах и каком select'е идёт речь:

    const labels = document.querySelectorAll('#price_block .change_model_iphone .item label');
    const select = document.querySelector('#select_model');

    Как получить for:

    const getFor = el => el.getAttribute('for');
    // или
    const getFor = el => el.attributes.for.value;
    // или
    const getFor = el => el.htmlFor;

    Заполняем select option'ами:

    // можно перезаписать разметку
    select.innerHTML = Array
      .from(labels, n => `<option value="${getFor(n)}">iPhone ${n.innerText}</option>`)
      .join('');
    
    // или, напрямую создавать новые элементы
    select.append(...Array.prototype.map.call(
      labels,
      n => new Option(`iPhone ${n.textContent}`, getFor(n))
    ));
    Ответ написан
    1 комментарий
  • Как по value в селекте, найти такой же текст в селекторе, и добавить селектору класс?

    0xD34F
    @0xD34F Куратор тега JavaScript
    <div class="text">hello, world!!</div>
    <div class="text">fuck the world</div>
    <div class="text">fuck everything</div>
    
    <select></select>

    const texts = document.querySelectorAll('.text');
    const select = document.querySelector('select');
    
    select.append(...Array.from(texts, n => new Option(n.textContent)));
    select.value = null;
    
    select.addEventListener('change', ({ target: { selectedIndex } }) => {
      texts.forEach((n, i) => n.classList.toggle('active', i === selectedIndex));
    });
    Ответ написан
    1 комментарий
  • Как при выборе select - а, найти и чекнуть радиокнопку с таким же value?

    0xD34F
    @0xD34F Куратор тега JavaScript
    О каком select'е и каких радиокнопках идёт речь:

    const select = document.querySelector('[name="select_model"]');
    const radios = document.querySelectorAll('[name="model"]');

    Обновляем состояние радиокнопок при выборе значения в select'е:

    select.addEventListener('change', ({ target: { value } }) => {
      Array.prototype.find.call(radios, n => n.value === value).checked = true;
    });

    И наоборот:

    radios.forEach(function(n) {
      n.addEventListener('change', this);
    }, e => select.value = e.target.value);
    Ответ написан
    Комментировать
  • Как сделать автоматическое закрытие?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const
      overlay = document.getElementById('overlay'),
      delay_open = 5000,
      delay_close = 10000;
    
    setTimeout(function() {
      overlay.style.display = 'block';
      setTimeout(function() {
        overlay.style.display = 'none';
      }, delay_close);
    }, delay_open);
    Ответ написан
    Комментировать
  • Как из класса убрать модификатор через js?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Что надо убрать: const classPrefix = 'toggle-';.

    Как получить соответствующие элементы:

    // вариант попроще - хватаем всё, что содержит указанную подстроку; так можно нарваться
    // на выполнение бессмысленной работы, будут отобраны элементы, у которых ничего
    // не будет удалено - это если подстрока находится не в начале класса, например xxx-toggle-xxx
    const elements = document.querySelectorAll(`[class*="${classPrefix}"]`);
    
    // вариант посложнее, поуродливее, но без обработки лишнего - хватаем элементы,
    // у которых класс начинается с указанной подстроки, или содержит указанную подстроку,
    // а перед ней ещё есть пробел
    const elements = document.querySelectorAll(`[class^="${classPrefix}"], [class*=" ${classPrefix}"]`);

    Убираем:

    const reg = RegExp(`(^|\\s)${classPrefix}`);
    elements.forEach(n => n.className = n.className.split(reg).join(' ').trim());
    
    // или
    
    elements.forEach(function(n) {
      n.classList.value = n.classList.value.replace(this, '$1');
    }, RegExp(`(^| )${classPrefix}`, 'g'));
    
    // или
    
    for (const { classList: cl } of elements) {
      for (const n of [...cl]) {
        if (n.startsWith(classPrefix)) {
          cl.remove(n);
          cl.add(n.slice(classPrefix.length));
        }
      }
    }
    Ответ написан
    Комментировать
  • Как игнорировать текст в input и выводить весь список по нажатию на кнопку?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Если бы вы составили себе труд ознакомиться с документацией, то знали бы, что для игнорирования содержимого инпута надо при вызове метода search указать значение. В вашем случае, раз хотите получать полный список - передавайте пустую строку:

    $('#searchSity').autocomplete('search', '');
    Ответ написан
    Комментировать
  • В jQuery при выборке класса, где в конце названия стоит точка, выходит ошибка, как быть?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('.nameClass\\.')
    Ответ написан
    Комментировать
  • Как вывести несколько вложенных объектов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Получаем массив значений, вырезаем из него подмассив нужной длины:

    const getValues = (obj, count) =>
      count > 0
        ? Object.values(obj).slice(0, count)
        : [];

    Или, перебираем имена свойств, сохраняем значения собственных, как наберётся сколько надо, прерываем цикл:

    function getValues(obj, count) {
      const result = [];
    
      for (const k in obj) {
        if (result.length >= count) {
          break;
        } else if (obj.hasOwnProperty(k)) {
          result.push(obj[k]);
        }
      }
    
      return result;
    }
    Ответ написан
    Комментировать
  • Как получить элемент который находится под заданым элементом?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Достаёте из объекта события координаты, по которым был сделан клик, передаёте их в document.elementsFromPoint. Из полученного массива достаёте элемент под индексом 1 (0 - это сам кликнутый элемент).

    https://jsfiddle.net/6prekj29/
    Ответ написан
    Комментировать
  • Как обработать такой массив в аналогичный с уникальными значениями по свойству?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const groupUnique = (arr, idKey, ...keys) => Object
      .values(arr.reduce((acc, n) => {
        const id = n[idKey];
        acc[id] = acc[id] || keys.reduce((group, k) => (group[k] = [], group), {...n});
        keys.forEach(k => acc[id][k].push(...n[k]));
        return acc;
      }, {}))
      .map(n => (keys.forEach(k => n[k] = [...new Set(n[k])]), n));
    
    
    const result = groupUnique(arr, 'family', 'variants', 'subsets');
    Ответ написан
    6 комментариев
  • Как найти все input поля и очистить при клонировании Node?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как лучше удалять весь текст с input полей при клонировании елемента ?

    Не надо ничего удалять. Можно изначально сделать копию пустой строки, и копировать её при добавлении новой .form-row, а не один из элементов, которые присутствуют в #BodyForm.

    подскажите как избежать удаления последнего элемента

    Очевидно же: проверяете количество элементов при вызове функции удаления - если остался 1, ничего не делаете.

    Или, если под последним вы понимаете не последний оставшийся, а последний по своему положению внутри #BodyForm - тоже очевидно: получаете последний элемент в функции удаления и сравниваете его с удаляемым, если равны, ничего не делаете.

    Исправлено

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.2/css/bootstrap.css">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css">
    
    <div id="BodyForm">
      <div class="form-row form-row-data">
        <div class="form-group col-sm-3">
          <input type="text" class="form-control" placeholder="Name">
        </div>
        <div class="form-group col-sm">
          <input type="text" class="form-control" placeholder="Value">
        </div>
        <div class="form-group col-sm-auto">
          <button type="button" class="btn btn-secondary btn-block" onclick="delRow(this)">
            <em class="fa fa-minus"></em>
          </button>
        </div>
      </div>
    
      <div class="form-row justify-content-end">
        <div class="col-sm-4">
          <button type="button" class="btn btn-outline-success btn-block pull-right" onclick="addRow()">
            <i class="fa fa-plus"> Add</i>
          </button>
        </div>
        <div class="col-sm-4">
          <button type="button" class="btn btn-outline-danger btn-block pull-right">
            <i class="fa fa-trash"> Clear all</i>
          </button>
        </div> 
      </div>
    </div>

    const form = document.querySelector('#BodyForm');
    const rows = form.getElementsByClassName('form-row-data');
    const row = rows[0].cloneNode(true);
    const footer = form.querySelector('.justify-content-end');
    
    const addRow = () => footer.before(row.cloneNode(true));
    const delRow = el => rows.length > 1 && el.closest('.form-row-data').remove();
    Ответ написан
  • Почему js выполняет код несколько раз?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вы обходите массив, проверяете совпадение имени - ну, отлично. А вот что не отлично - так это ветка else, где вы пишите в результат поиска, что ничего не найдено. Делать это надо один раз - после цикла, а не внутри. Для этого можете перед циклом объявить переменную, типа var found = false, в случае если совпадение найдено - устанавливаете её в true. А код из блока else выносите за цикл и оборачиваете в if (!found).
    Ответ написан
    Комментировать
  • Как найти в массиве объектов нужный объект по ключу?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const getCard = num => cards.find(n => n.id === num);
    // ...
    const card = getCard(cardRandom(1, 51));

    Правда, не очень понятно, зачем такие сложности. Кроме того, непонятно, гарантируется ли существование объекта с указанным id. Может, лучше использовать случайное число как индекс? Типа так:

    const card = cards[Math.random() * cards.length | 0];
    Ответ написан
    Комментировать
  • Как из двух массивов сделать объект с новыми свойствами?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const TYPES = {
      1: 'region',
      3: 'area',
      7: 'street',
    };
    
    const newItems = items.map(({ parents_names, parents_levels, ...n }) =>
      parents_names.reduce((acc, name, i) => (
        acc[TYPES[parents_levels[i]]] = name,
        acc
      ), n)
    );
    Ответ написан
    1 комментарий
  • Как найти элемент имеющий определенный класс и еще значение?

    0xD34F
    @0xD34F Куратор тега JavaScript
    О каких классе, имени атрибута и значении идёт речь:

    const className = 'element';
    const attrName = 'data-attr';
    const attrValue = 'this-element';

    Если больше заранее ничего не известно, то собираем селектор и получаем элемент:

    const elem = document.querySelector(`.${className}[${attrName}="${attrValue}"]`);

    Если же вдруг уже была получена коллекция элементов с указанным классом...

    const elems = document.getElementsByClassName(className);
    
    // или
    
    const elems = document.querySelectorAll('.' + className);

    ...то имеет смысл поискать в ней вместо всей страницы:

    const elem = Array.prototype.find.call(
      elems,
      n => n.getAttribute(attrName) === attrValue
    );
    
    // или
    
    let elem = null;
    for (const n of elems) {
      if ((n.attributes[attrName] || {}).value === attrValue) {
        elem = n;
        break;
      }
    }
    
    // или
    
    let elem = null;
    for (let i = 0; !elem && i < elems.length; i++) {
      elem = elems[i].matches(`[${attrName}="${attrValue}"]`) ? elems[i] : elem;
    }
    Ответ написан
    Комментировать
  • Как передать значение data в dom элементы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Подсказали что правильно сделать через атрибут data-*

    Ну да. Добавляете блокам такие же data-key, как у тех элементов, по клику на которые блоки надо показывать. По клику хватаете все блоки и показываете те, у которых data-key совпал с кликнутым, остальные скрываете:

    $(document).on('click', 'a[data-key]', function() {
      $('div[data-key]')
        .hide()
        .filter((i, n) => n.dataset.key === this.dataset.key)
        .show();
    });
    Ответ написан
    Комментировать
  • Как лучше рендерить клеточный автомат?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Имеется довольно большая матрица (чем больше- тем лучше).
    Как правильно отрисовать её на странице?
    Хотелось бы еще и с нормальной частотой, хотя-бы раз в 50 ms.

    Используйте canvas. При правильном подходе сможете добиться результата на порядок лучше, чем 50 миллисекунд.

    не будет ли быстрее преобразовывать матрицу в строку через arr.toString()...

    Не будет.

    Картинка
    5b4474efbdc06068415417.jpeg

    Указывать состояния не нужно - цветового обозначения вполне достаточно. Кроме того, при небольших размерах клеток вы эти цифры либо не увидите, либо они не будут влезать в свои клетки (вы представьте, что отрисовываете матрицу хотя бы 300x300).
    Ответ написан
  • Получить индекс последнего числа в строке?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const index = str.search(/\d\D*$/);
    
    // или
    
    const index = str.replace(/\D*$/, '').length - 1;
    
    // или
    
    const index = [...str].reduce((max, n, i) => +n === +n ? i : max, -1);
    
    // или
    
    const index = +(Object.entries(str).filter(n => !isNaN(n[1])).pop() || [ -1 ])[0];
    
    // или
    
    let index = str.length;
    while (--index >= 0 && !'0123456789'.includes(str[index])) ;
    Ответ написан
    Комментировать
  • Как проверить, что элемент уже существует, и заменить его?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вместо prepend используйте метод html.

    Или, если внутри #imgTitle есть ещё какой-то контент, сначала удаляйте предыдущий img:

    $('#imgTitle').find('img').remove().end().prepend(...
    Ответ написан
  • Как выбрать по дочернему, а после родителю .appendTo()?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('.mod__l').append(function() {
      return ({
        m1: mod__c1,
        m2: mod__c2,
        m3: mod__c3,
      })[$('.mod__input', this).data('mod')];
    });
    Ответ написан
    1 комментарий