Задать вопрос
Ответы пользователя по тегу JavaScript
  • Где ошибка в коде?

    0xD34F
    @0xD34F Куратор тега JavaScript
    А не кажется ли вам, что сначала надо определить функцию, и только потом привязывать её куда-то в качестве обработчика события - а не наоборот?
    Ответ написан
    Комментировать
  • Как в svg.js реализовать такое?

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

    Можно, только наверное не по одной - скажем по 100 за раз. Показали часть точек - setTimeout на показ следующей части. Типа так:

    const getRandom = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
    
    const NUM_POINTS = 100000;
    
    const BASE_POINTS = [
      [ 50, 50 ],
      [ 1200, 50 ],
      [ 625, 500 ],
    ];
    
    const draw = SVG('drawing').size(1200, 500);
    const group = draw.group();
    
    let currPoints = 0;
    let point = [ (getRandom(50, 1200)), (getRandom(50, 500)) ];
    
    function nextPoint(previousPoint) {
      const basePoint = BASE_POINTS[getRandom(0, BASE_POINTS.length - 1)];
      point = [ (previousPoint[0] + basePoint[0]) / 2, (previousPoint[1] + basePoint[1]) / 2 ];
      group.add(draw.circle(1).fill('#000').move(point[0], point[1]));
    }
    
    (function next() {
      if (currPoints < NUM_POINTS) {
        for (let i = 0; i < 100; i++, currPoints++) {
          nextPoint(point);
        }
    
        setTimeout(next, 50);
      }
    })();

    <script src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.5/svg.min.js"></script>
    
    <div id="drawing"></div>
    Ответ написан
    Комментировать
  • Почему в значениях инпута нету данных объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    if (elem == "edit") {
        app.UserBook.fullView(elem);

    Понятно, elem - это строка.

    fullView(elem) {
        const d = document;
        const i = elem;
        d.querySelector('#Edname').value = this.items[i].fname;

    И используя эту строку как ключ, вы пытаетесь что-то достать из this.items.

    Из тех самых items, которые вроде бы массив:

    for (let i = 0; i < this.items.length; i++) {


    Как-то странно получается, не находите?
    Ответ написан
    7 комментариев
  • Как заменить последние четыре цифры, если встречается такое совпадение?

    0xD34F
    @0xD34F Куратор тега JavaScript
    time.replace(/0{4}$/, '00')
    
    // или
    
    time.replace(/0{4}$/, m => m.slice(-2))
    
    // или
    
    time.replace(/00(00)$/, '$1')
    
    // или
    
    time.replace(/00(?=00$)/, '')
    
    // или
    
    time.replace(/(?<=00)00$/, '')
    
    // или
    
    time.endsWith('0000') ? time.slice(0, -2) : time
    Ответ написан
    Комментировать
  • Как вставить последнее значение в массив со сложной структурой?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Есть какой нибудь более удобный способ ?

    Под более удобным вы понимаете более короткую запись? Можно заменить обращение к последним элементам массивов на .slice(-1)[0], получится так:

    masMain.slice(-1)[0].mas1.slice(-1)[0].mas2.push(objectDoc);

    UPD. Наконец-то дождались, и трёх лет не прошло: masMain.at(-1).mas1.at(-1).mas2.push(objectDoc);.
    Ответ написан
    Комментировать
  • Как проверить наличие значения в массиве объектов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как превратить в массив значений id...

    const ids = [].concat(...data.result.map(n => n.test.map(m => m.id)))

    ...и уже в нем искать значение, равное 12?

    ids.includes(12)

    Но вообще, можно обойтись и без массива id:

    data.result.some(n => n.test.some(m => m.id === 12))
    Ответ написан
    Комментировать
  • Как скрыть блок, внутри которого находится блок с определённым классом?

    0xD34F
    @0xD34F Куратор тега CSS
    О каких классах идёт речь:

    const outerClass = 'item';
    const innerClass = 'hidden';

    Как скрыть элемент:

    const hide = el => el.style.display = 'none';
    // или
    const hide = el => el.style.setProperty('visibility', 'hidden');
    // или
    const hide = el => el.style.cssText += 'opacity: 0';
    // или
    const hide = el => el.setAttribute('style', 'transform: scale(0)');
    // или
    const hide = el => el.hidden = true;

    Скрываем:

    document.querySelectorAll(`.${innerClass}`).forEach(n => {
      if (n = n.closest(`.${outerClass}`)) {
        hide(n);
      }
    });
    
    // или
    
    for (const n of document.getElementsByClassName(outerClass)) {
      if (n.querySelector(`.${innerClass}`)) {
        hide(n);
      }
    }

    UPD. Наконец-то дождались, теперь js тут использовать необязательно:

    .item:has(.hidden) {
      display: none;
    }
    Ответ написан
    1 комментарий
  • Как добавить кликом по ссылке class для div?

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

    Можно сделать несколько классов, для каждого из которых определён свой поворот, и последовательно их менять:

    .rotate0   { transform: rotate(0deg); }
    .rotate90  { transform: rotate(90deg); }
    .rotate180 { transform: rotate(180deg); }
    .rotate270 { transform: rotate(270deg); }

    <a href="#" data-rotate="-1">Повернуть на -90 градусов</a>
    <a href="#" data-rotate="+1">Повернуть на +90 градусов</a>

    const photo = document.querySelector('.photo');
    const classes = [ 'rotate0', 'rotate90', 'rotate180', 'rotate270' ];
    let index = 0;
    
    document.addEventListener('click', function(e) {
      const rotate = +e.target.dataset.rotate;
      if (rotate) {
        photo.classList.remove(classes[index]);
        index = (index + rotate + classes.length) % classes.length;
        photo.classList.add(classes[index]);
      }
    });


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

    а можно пример, чтобы поворачивать по 1 градусу и в обратную сторону

    Для поворота по одному градусу я конечно не стал бы делать отдельные классы, а вписывал бы нужное значение в style.transform:

    <a href="#" data-rotate="-1">rotate ccw</a>
    <a href="#" data-rotate="+1">rotate cw</a>

    const photo = document.querySelector('.photo');
    let angle = 0;
    
    document.querySelectorAll('[data-rotate]').forEach(n => n.addEventListener('click', onClick));
    
    function onClick({ target: { dataset: { rotate } } }) {
      angle = (angle + +rotate + 360) % 360;
      photo.style.transform = `rotate(${angle}deg)`;
    }
    Ответ написан
    3 комментария
  • Как поменять части строки местами в JS?

    0xD34F
    @0xD34F Куратор тега JavaScript
    str.split('-').reverse().join('.')
    
    // или
    
    str.replace(/(\d+)-(\d+)-(\d+)/, '$3.$2.$1')
    
    // или
    
    new Date(str).toLocaleDateString('ru-RU')
    
    // или
    
    str.match(/\d+/g).reduce((acc, n) => n + (acc && '.') + acc, '')
    Ответ написан
    Комментировать
  • Как сделать ограничение на одно предупреждение?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Элементам с сообщениями об ошибках назначайте класс (это в методе showMessage):

    messageNode.classList.add('error-message');

    По которому перед проверкой (это в начале метода checkFieldType) вы их будете находить и удалять:

    self.formElement.querySelectorAll('.error-message').forEach(n => n.remove(n));
    Ответ написан
    Комментировать
  • Как переключить видимость блока при изменении состояния чекбокса?

    0xD34F
    @0xD34F Куратор тега CSS
    что не так в скрипте

    А что, думаете функция сама себя должна привязать к чекбоксу в качестве обработчика события change? Нет, так не будет - это ваша работа.

    можно ли его сделать проще

    Можно:

    document.querySelector('#play').addEventListener('change', e => {
      document.querySelector('.block').style.opacity = +e.target.checked;
    });

    Или, вообще без js:

    #play:checked ~ div > .block {
      opacity: 1;
    }
    Ответ написан
    1 комментарий
  • Как сделать функцию, которая выполнится только один раз?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Пусть функция перезаписывает себя пустой функцией:

    function one() {
      console.log('AAAAAAAAAA');
      one = () => {};
    }

    Или, можно как декоратор это дело оформить:

    function once(f) {
      let called = false;
    
      return function() {
        if (!called) {
          called = true;
          return f.apply(this, arguments);
        }
      };
    }
    
    const one = once(function() {
      console.log('AAAAAAAAAA');
    });
    Ответ написан
    Комментировать
  • Как позволить набирать input только числа и "+"?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Замените текущее регулярное выражение на /[^+\d]/g.

    Ну а вообще, как я понял, вы хотите реализовать ввод телефона. Рекомендую посмотреть в сторону таких вещей как inputmask, например.
    Ответ написан
    Комментировать
  • Как найти последовательные совпадения в массиве?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const newArr = arr
      .reduce((acc, n, i, a) => (
        a[i - 1] !== n && acc.push([ n, 0 ]),
        acc[acc.length - 1][1]++,
        acc
      ), [])
      .reduce((acc, n) => (
        acc.push(...Array(n[1]).fill(n[1] > 2 ? `${n[0]}` : n[0])),
        acc
      ), []);

    или

    const newArr = arr.map((n, i, a) => (
      a[i - 1] === n && a[i - 2] === n ||
      a[i + 1] === n && a[i + 2] === n ||
      a[i - 1] === n && a[i + 1] === n
        ? `${n}`
        : n
    ));
    Ответ написан
    Комментировать
  • Как из массива объектов получить массив уникальных значений определённого свойства?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как делать надо: [...new Set(arr.map(n => n.id))].

    И как не надо:

    Object.values(arr.reduce((acc, n) => (acc[n.id] = n.id, acc), {}))
    
    // или
    
    Array.from(new Map(arr.map(({ id }) => [ id, id ])).values())
    
    // или
    
    arr.map(n => n.id).filter((n, i, a) => i === a.indexOf(n))
    
    // или
    
    arr.reduce((acc, n) => (acc.includes(n.id) || acc.push(n.id), acc), [])
    Ответ написан
    Комментировать
  • Не стандартное преобразование строки к числу в js?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Не удалось нарыть инфы по этому вопросу

    Откройте спецификацию, да почитайте.

    есть ли ограничения у данного способа?

    parseInt('666!!!') // 666
    
    +'666!!!' // NaN
    Ответ написан
    2 комментария
  • Как узнать есть ли элемент с определённым содержимым?

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

    const elem = Array
      .from(document.querySelectorAll('.wrap .price'))
      .find(n => n.textContent === price);
    
    if (elem) {
      ...

    Получаем все элементы, которые содержат заданный текст:

    const elems = Array.prototype.filter.call(
      document.querySelectorAll('.wrap .price'),
      n => n.innerText.includes(price)
    );
    
    if (elems.length) {
      ...
    Ответ написан
    Комментировать
  • Как найти все элементы с определённым классом и сложить их содержимое?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Кого надо сложить: const className = 'price';.

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

    const elements = document.querySelectorAll(`.${className}`);
    // или
    const elements = document.getElementsByClassName(className);

    Как из элемента извлечь значение:

    const getVal = el => parseFloat(n.textContent);
    // или
    const getVal = el => Number(el.innerText.split(' ')[0]);
    // или
    const getVal = el => +el.innerHTML.match(/\d+(\.\d+)?/)[0];

    Извлекаем, складываем:

    const sum = Array.prototype.reduce.call(
      elements,
      (acc, n) => acc + getVal(n),
      0
    );
    
    // или
    
    let sum = 0;
    for (const n of elements) {
      sum += getVal(n);
    }
    
    // или
    
    let sum = 0;
    for (let i = 0; i < elements.length; i++) {
      sum += getVal(elements[i]);
    }
    
    // или
    
    const sum = eval(Array.from(elements, getVal).join('+')) || 0;
    
    // или
    
    const sum = (function get(i, n = elements.item(i)) {
      return n ? getVal(n) + get(i + 1) : 0;
    })(0);
    Ответ написан
    Комментировать
  • Как открыть именно одно сабменю по клику на ссылку?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Замените

    $(".account_ads_more_block").toggleClass("active");

    на

    $(this).next(".account_ads_more_block").toggleClass("active");
    Ответ написан
    3 комментария
  • Почему данные всегда одинаковые?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Object.assign не выполняет глубокого копирования. Так что просто устанавливать значение value нельзя - это value одних и тех же объектов. Можно перезаписывать объект целиком, замените

    fullField[field_name].value = element[field_name] || 'NULL';

    на

    fullField[field_name] = Object.assign(
      {},
      fullField[field_name],
      { value: element[field_name] || 'NULL' },
    );
    Ответ написан
    3 комментария