Задать вопрос
  • Как пропустить через вложенный цикл два массива в ruby?

    0xD34F
    @0xD34F
    Не нужен вложенный цикл. Добавьте индексы, и обращайтесь к элементам второго массива:

    goods.each.with_index do |n, i|
      puts n + " " + prices[i].to_s
    end

    UPD. Или можно объединить массивы:

    print goods.zip(prices).map{|n| n.join(" ")}.join("\n")
    Ответ написан
    2 комментария
  • Как можно сделать код на Javascript более оптимальным?

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

    function toggleClasses(block) {
      const info = block.querySelector('.infoWrapper');
      block.classList.toggle('marginBottom10');
      block.classList.toggle('marginBottom120');
      info.classList.toggle('displayNone');
      info.classList.toggle('displayBlock');
    }

    Подключение отдельных обработчиков клика к каждой кнопке заменим одним делегированным обработчиком, а вместо ручного перебора всех блоков просто будем искать открытый:

    document.addEventListener('click', function(e) {
      const block = e.target.closest('.blockSvg');
      if (block) {
        const prevBlock = document.querySelector('.blockSvg.marginBottom120');
        if (prevBlock && prevBlock !== block) {
          toggleClasses(prevBlock);
        }
    
        toggleClasses(block);
      }
    });

    В результате, объём кода сократился на два порядка.

    Ну и конечно, надо перевёрстывать, потому что вот это вот "подправляем положение блоков" - позорище какое-то.
    Ответ написан
    1 комментарий
  • Как сохранить кавычки вокруг атрибутов при сборке vue-cli-service build?

    0xD34F
    @0xD34F Куратор тега Vue.js
    vue.config.js:

    module.exports = {
      chainWebpack: config => {
        config
          .plugin('html')
          .tap(args => {
            args[0].minify.removeAttributeQuotes = false;
            return args;
          })
      }
    };
    Ответ написан
    6 комментариев
  • Почему float округляет?

    0xD34F
    @0xD34F
    Нет никакого округления float. Вычисленное значение изначально является целым - потому что целыми являются все части выражения. Замените /3 на /3.0.
    Ответ написан
    Комментировать
  • Почему не работает globalCompositeOperation в canvas?

    0xD34F
    @0xD34F
    Всё работает. Просто вы сначала изменяете globalCompositeOperation, а затем рисуете картинку - естественно, что не видно ничего, всё становится прозрачным, рисовать текст после этого уже бессмысленно. Поменяйте порядок действий - сначала рисование картинки, затем изменение globalCompositeOperation. Как-то так.
    Ответ написан
    Комментировать
  • Можно ли выбрать определенные элементы?

    0xD34F
    @0xD34F Куратор тега CSS
    .container :nth-child(5n),
    .container :nth-child(5n-1),
    .container :nth-child(5n-2) {
      ...
    }
    Ответ написан
    Комментировать
  • Как определить место по точке на карте?

    0xD34F
    @0xD34F Куратор тега Яндекс.Карты
    Слушать событие dragend, выполнять обратное геокодирование:

    <div>{{ address }}</div>
    <div ref="map"></div>

    data: () => ({
      coords: [ ... ],
      address: '',
    }),
    mounted() {
      ymaps.ready(() => {
        const map = new ymaps.Map(this.$refs.map, { ... });
    
        const marker = new ymaps.Placemark(this.coords, {}, {
          draggable: true,
        });
    
        marker.events.add('dragend', e => {
          this.coords = e.get('target').geometry.getCoordinates();
        });
    
        map.geoObjects.add(marker);
    
        this.$watch('coords', {
          immediate: true,
          handler(coords) {
            ymaps.geocode(coords).then(r => {
              this.address = r.geoObjects.get(0).properties.get('name');
            });
          },
        });
      });
    },
    Ответ написан
    Комментировать
  • Как изменить содержимое всех найденных элементов на странице с помощью jquery?

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

    const className = 'dop_atr';
    const maxlen = 250;

    Чтобы все элементы обрабатывались индивидуально, вместо строки можно передавать в метод text функцию - вызывается для каждого элемента набора, принимает текущее текстовое содержимое элемента и возвращает новое:

    $(`.${className}`).text((i, text) => {
      return text[maxlen] ? `${text.substring(0, maxlen)}...` : text;
    });

    Или, можно отказаться от jquery:

    for (const n of document.getElementsByClassName(className)) {
      n.innerText = n.innerText.slice(0, maxlen) + (n.innerText.charAt(maxlen) && '...');
    }
    
    // или
    
    document.querySelectorAll(`.${className}`).forEach(function(n) {
      n.textContent = n.textContent.replace(this, '$1...');
    }, RegExp(`(.{${maxlen}}).+`));
    Ответ написан
    Комментировать
  • Как отмечать определенные checkbox при клике по ссылке?

    0xD34F
    @0xD34F Куратор тега JavaScript
    document.addEventListener('click', function(e) {
      const el = document.getElementById(e.target.dataset.id);
      if (el) {
        el.checked = !el.checked;
      }
    });

    или

    const buttons = document.querySelectorAll('[data-id]');
    const onClick = e => checkboxes[e.target.dataset.id].checked ^= 1;
    const checkboxes = Array
      .from(buttons, n => n.dataset.id)
      .reduce((acc, n) => (acc[n] = document.querySelector(`#${n}`), acc), {});
    
    buttons.forEach(n => n.addEventListener('click', onClick));
    Ответ написан
    Комментировать
  • Можно ли строку перевести в объект?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('.tab__list').on('click', '.tab__item', function() {
      const
        $this = $(this),
        { label, ...attrs } = text[$this.data('tab')];
    
      $this.siblings().removeClass('tab__item--active');
      $this.addClass('tab__item--active');
      $('#formField').attr(attrs);
      $('#formLabel').text(label);
    });
    Ответ написан
    6 комментариев
  • Как воспользоваться функцией, переданной в props?

    0xD34F
    @0xD34F Куратор тега React
    onNoteAdd = {this.handleNoteAdd.bind(this)}

    this.props.onNodeAdd(newNote)

    Так как всё-таки правильно - Note или Node? Вы уж разберитесь.

    UPD. А что так многословно?

    Можно и покороче, вместо

    const newNote = {
      title: this.state.title,
      text: this.state.text,
      color: this.state.color
    };
    
    this.props.onNodeAdd(newNote);

    пусть будет this.props.onNoteAdd({ ...this.state });.

    Также нет необходимости в двух методах для обновления стейта, можно сделать общий, а какое свойство должно быть обновлено - указывать через атрибут name:

    onChange = ({ target: { name, value } }) => {
      this.setState({ [name]: value });
    }

    <input
      name="title"
      onChange={this.onChange}
      ...
    />
    <textarea
      name="text"
      onChange={this.onChange}
      ...
    />

    Ответ написан
  • Как на jQuery поменять стиль у label с активным input radio?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вместо

    .red{border:3px solid red;;}
    .green{border:3px solid red;;}

    пусть будет

    .items-list-item-colors label {
      border: 3px solid red;
    }
    
    .items-list-item-colors label.active {
      border-color: green;
    }

    Соответственно, из разметки class="red" вырезаете.

    Где, кому и какой класс будем переключать:

    const containerSelector = '.items-list-item-colors';
    const itemSelector = 'label';
    const activeClass = 'active';

    Такие есть варианты:

    $(containerSelector).change(function() {
      $(itemSelector, this)
        .removeClass(activeClass)
        .has(':checked')
        .addClass(activeClass);
    });
    
    // или
    
    document.querySelectorAll(containerSelector).forEach(n => {
      n.addEventListener('change', onChange);
    });
    
    function onChange({ target: t }) {
      this.querySelectorAll(itemSelector).forEach(n => {
        n.classList.toggle(activeClass, n.contains(t));
      });
    }
    
    // или
    
    document.addEventListener('change', e => {
      const item = e.target.closest(itemSelector);
      if (item) {
        item.closest(containerSelector).querySelectorAll(itemSelector).forEach(n => {
          n.classList.toggle('active', n === item);
        });
      }
    });
    Ответ написан
    Комментировать
  • Как удалить копии добавленного блока?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Добавляете блок в случае, если его нет:

    const $inner = $('.inner');
    if (!$inner.find('.butt_back').length) {
      $inner.append(...);
    }


    Или, если вам действительно надо удалять предыдущие:

    $('.inner')
      .find('.butt_back').remove()
      .end()
      .append(...);
    Ответ написан
    Комментировать
  • Почему не работает клонирование canvas?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Что не так ?

    Да всё не так.

    Что за clone? - у DOM-узлов такого метода нет. Есть cloneNode. Или используйте jquery (судя по тому, что контекст вы пытаетесь получить у clone[0], так и предполагалось), там clone есть: $(canvas).clone().

    Копировать содержимое оригинала вы пытаетесь до того, как оно вообще будет загружено. Выполняйте копирование в onload.

    Копируете непонятно откуда:

    canvas = document.getElementById('myCanvas');
    <...>
    drawImage(canvas[0],

    Опять же - либо canvas = $('#myCanvas'), либо drawImage(canvas,.

    UPD. Должно было быть так?
    Ответ написан
    3 комментария
  • Как запустить функцию только один раз?

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

    $(window).scroll(function onScroll() {
      const $this = $(this);
      if ($this.scrollTop() > scrollToElem) {
        $('#popup-item').addClass('popup-open');
        $this.off('scroll', onScroll);
      }
    });
    Ответ написан
    Комментировать
  • Как правильно отрендерить данные на react с разрывом?

    0xD34F
    @0xD34F Куратор тега React
    Сделайте отдельный компонент для вывода данных и создайте два его экземпляра: первому передаёте первые три элемента, а второму - все оставшиеся. Как-то так:

    const DataList = ({ data }) => (
      <div>
        {data.map((item) => (
          <div key={item.id}>
            {item.title}
            {item.round.map((r) => <div key={r.id}>{r.total}</div>)}
          </div>
        ))}
      </div>
    );

    <DataList data={props.data.slice(0, 3)} />
    <Separator />
    <DataList data={props.data.slice(3)} />
    Ответ написан
    Комментировать
  • Как добавить слепок текущего состояния?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Проблема в реактивности, при изменении текстов в инпуте, меняются старые записанные обьекты

    Ну да, ну да. Вот так и получается: JS не учи, фреймворки используй.

    Сохраняйте копию вместо оригинала. Типа так:

    state.filter_list.push({ ...state.filter })

    Это если объект плоский. Если есть вложенность, используйте _.cloneDeep, например (или какой-либо иной аналог, или сами можете попробовать реализовать рекурсивную функцию копирования).
    Ответ написан
    3 комментария
  • Как остановить setInterval из другой функции?

    0xD34F
    @0xD34F Куратор тега JavaScript
    document.addEventListener('mouseover', ({ target: t }) => {
      if (t.classList.contains('pic') && !t.dataset.interval) {
        t.dataset.interval = bgRotate(t);
      }
    });
    
    document.addEventListener('mouseout', ({ target: t }) => {
      const { interval } = t.dataset;
      if (interval) {
        clearInterval(interval);
        delete t.dataset.interval;
      }
    });

    или

    document.querySelectorAll('.pic').forEach(n => {
      n.addEventListener('mouseenter', onHover);
      n.addEventListener('mouseleave', onHover);
    });
    
    function onHover({ type, target: t }) {
      const d = t.dataset;
      if (type === 'mouseenter' && !d.interval) {
        d.interval = bgRotate(t);
      } else if (type === 'mouseleave') {
        clearInterval(d.interval);
        delete d.interval;
      }
    }
    Ответ написан
  • Как сделать смену картинок на jquery с помощью радиокнопок?

    0xD34F
    @0xD34F Куратор тега JavaScript
    .images_box a {
      display: none;
    }
    
    .images_box a.active {
      display: inline;
    }

    const containerSelector = '.items-list-item-wrapper';
    const buttonSelector = '.items-list-item-colors input';
    const contentSelector = '.images_box a';
    const activeClass = 'active';
    
    
    // jquery, как вы и хотели
    $(containerSelector).on('change', buttonSelector, function(e) {
      $(contentSelector, e.delegateTarget)
        .removeClass(activeClass)
        .eq($(buttonSelector, e.delegateTarget).index(this))
        .addClass(activeClass);
    }).each((i, n) => $(buttonSelector, n).first().click());
    
    // или, к чёрту jquery
    document.querySelectorAll(containerSelector).forEach(n => {
      n.addEventListener('change', onChange);
      n.querySelector(buttonSelector).click();
    });
    
    function onChange({ target: t }) {
      if (t.matches(buttonSelector)) {
        const buttons = this.querySelectorAll(buttonSelector);
        const index = Array.prototype.indexOf.call(buttons, t);
        this.querySelectorAll(contentSelector).forEach((n, i) => {
          n.classList.toggle(activeClass, i === index);
        });
      }
    }
    Ответ написан
    Комментировать