Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как игнорировать текст в 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 совпал с кликнутым, остальные скрываете:

    const key = 'key';
    const buttonSelector = `a[data-${key}]`;
    const contentSelector = `div[data-${key}]`;

    $(document).on('click', buttonSelector, function() {
      $(contentSelector)
        .hide()
        .filter((i, n) => n.dataset[key] === this.dataset[key])
        .show();
    });
    
    // или
    
    document.addEventListener('click', ({ target: t }) => {
      if (t = t.closest(buttonSelector)) {
        document.querySelectorAll(contentSelector).forEach(n => {
          n.hidden = n.dataset[key] !== t.dataset[key];
          // или (надо будет в стили добавить .hidden { display: none; })
          n.classList.toggle('hidden', n.dataset[key] !== t.dataset[key]);
        });
      }
    });
    Ответ написан
    Комментировать
  • Как лучше рендерить клеточный автомат?

    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])) ;
    
    // или
    
    const index = (function get(i) {
      return i < 0 || !Object.is(str.charAt(i) * 1, NaN)
        ? i
        : get(~-i);
    })(~-str.length);
    Ответ написан
    Комментировать
  • Как проверить, что элемент уже существует, и заменить его?

    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 комментарий
  • Почему this не указывает на контекст window?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Помогите пожалуйста понять почему следующий код выводит undefined, а не 5

    Выводит где? Как вы этот код запускали? Раз уж вы решили скрыть эту информацию...

    Ответ номер раз: а чо вы врёте-то? Открываем консоль, копируем код, запускаем и видим, что выводится 5.

    Ответ номер два: jsfiddle, например, по умолчанию оборачивает код в window.onload, соответственно, переменная b в window не попадёт - потому и undefined. (UPD. Исправили эту дичь).
    Ответ написан
    1 комментарий
  • Почему курсор прилипает у ползунку IonRangeSlider?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Кусок кода, который в этом виноват:

    $(document).mouseup(function (e) { 
        var popup = $('#free_moto_lesson');
        if (e.target!=popup[0]&&popup.has(e.target).length === 0){
            $('.overlay').fadeOut();
            $(popup).fadeOut();
        }
        return false;
    });

    А конкретно - return false.
    Ответ написан
    1 комментарий
  • JQuery UI Datepicker ограничение выбора диапозона?

    0xD34F
    @0xD34F Куратор тега JavaScript
    как сделать, чтобы можно было выбрать максимум 5 дней

    Ограничивать максимальную дату конца интервала при изменении начала, и минимальную дату начала при изменении конца. Как-то так.

    кстати когда убираю кусок кода, который переводит на русский, все работает

    Так форматы дат разные - вот и не получается правильно распарсить.

    UPD. Вынесено из комментариев.

    А как в таком случае сбросить начальную и конечную дату, если нужно другие числа выбрать?

    Можно сбрасывать интервал по клику на отдельную кнопку. Или по повторному клику на границу интервала в соответствующем дейтпикере (по нижней в #from, по верхней в #to; почему не по любой границе в любом - чтобы можно было выставить интервал в один день, иначе будет сбрасываться). Или... думайте.
    Ответ написан
    5 комментариев
  • Как выбрать 1, 2, 5 и 9 элементы в jquery?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Где элементы находятся, и индексы тех, что надо получить:

    const parentSelector = '.menu';
    const indices = [ 0, 1, 4, 8 ];

    Получаем:

    const $elems = $(parentSelector).children().filter(i => indices.includes(i));
    
    // или
    
    const $elems = $(indices.map(n => `> :eq(${n})`).join(', '), parentSelector);

    Или, к чёрту jquery:

    const elems = Array.prototype.filter.call(
      document.querySelector(parentSelector).children,
      (n, i) => indices.includes(i)
    );
    
    // или
    
    const elems = document
      .querySelector(parentSelector)
      .querySelectorAll(indices.map(n => `:scope > :nth-child(${n + 1})`));
    Ответ написан
    Комментировать
  • Как поворачивать объект в сторону мыши?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const canvas = document.querySelector('canvas');
    const ctx = canvas.getContext('2d');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    
    let X, Y;
    
    document.addEventListener('mousemove', function(e) {
      X = e.clientX;
      Y = e.clientY;
    });
    
    function drawRect(x, y, w, h) {
      const dx = x + w / 2;
      const dy = y + h / 2;
      const angle = Math.atan2(X - dx, Y - dy);
    
      ctx.save();
      ctx.translate(dx, dy);
      ctx.rotate(-angle);
      ctx.translate(-dx, -dy);
      ctx.strokeRect(x, y, w, h);
      ctx.restore();
    }
    
    function draw() {
      ctx.clearRect(0, 0, innerWidth, innerHeight);
      drawRect(50, 50, 50, 50);
      requestAnimationFrame(draw);
    }
    
    draw();
    Ответ написан
    1 комментарий