• Как обратиться к ключу массива с помощью другой переменной?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Есть ассоциативный многомерный массив

    Нет, у вас есть несколько объектов в разных переменных, а не один массив.

    Соответственно, решение - собрать данные в подходящую структуру. В данном случае это будет объект:
    var data = {
      sedan: {
            'eject' : {
              '13' : 50,
              '14' : 50,
              '15' : 50
            },
            'installation' : {
              '13' : 25,
              '14' : 40,
              '15' : 50
            },
            'balancing' : {
              '13' : 50,
              '14' : 60,
              '15' : 80
            }
      },
      crossover: {
            'eject' : {
              '13' : 50,
              '14' : 60,
              '15' : 60
            },
            'installation' : {
              '13' : 50,
              '14' : 60,
              '15' : 60
            },
            'balancing' : {
              '13' : 444,
              '14' : 555,
              '15' : 666
            }
      },
    };


    Ну и дальше всё просто:
    data[x].balancing
    Ответ написан
    1 комментарий
  • Как получить атрибут data с методом hasClass()?

    dimovich85
    @dimovich85 Куратор тега JavaScript
    https://u-academy.net/
    Вам нужен вот этот метод: http://jquery.page2page.ru/index.php5/Фильтрация_в...
    Он не делает нового поиска, а берет массив уже имеющихся объектов DOM, скорее объектов jq, и перебирает по заданным параметрам, возвращает массив только тех элементов, которые прошли проверку фильтра.
    Ответ написан
    3 комментария
  • Почему не работает калькулятор стоимости?

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

    Не совсем так. При каждом клике создаётся ещё один экземпляр val, подключаются ещё по одному обработчику клика к .value-btn-plus и .value-btn-minus, сами обработчики срабатывают в порядке подключения, поэтому в value-text последним будет записано значение val, к которому имеет доступ последний же подключенный обработчик - т.е. 0, или что там у вас.

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

    $(document).on('click', '.value-btn-plus, .value-btn-minus', function() {
      const $this = $(this);
      const change = $this.hasClass('value-btn-plus') ? 1 : -1;
    
      $this
        .closest('.input-box')
        .find('.value-text')
        .text((i, text) => Math.max(0, +text + change));
    });

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

    document.addEventListener('click', ({ target: t }) => {
      const change =
        t.classList.contains('value-btn-plus')  ?  1 :
        t.classList.contains('value-btn-minus') ? -1 :
                                                   0;
      if (change) {
        const valueEl = t.closest('.input-box').querySelector('.value-text');
        valueEl.innerText = Math.max(0, +valueEl.innerText + change);
      }
    });
    Ответ написан
    1 комментарий
  • Что добавить в счётчик js, который не досчитывает до нужного числа?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Косяков у вас тут целый ворох:
    • Многократные вызовы setInterval - при каждом событии scroll (из-за этого счётчики работают гораздо быстрее, чем запланировано)
    • Общая для всех счётчиков переменная текущего значения (вследствие чего шаг счётчиков вовсе не единица)
    • Неверное условие окончания работы счётчика; или неверное место увеличения текущего значения счётчика - после его перезаписи (отсюда несоответствие заданного и реального максимальных значений счётчиков)
    • После того как все счётчики завершили свою работу вы не прекращаете вызывать count (да, внешне это никак не проявляется, но всё равно - как-то небрежно)


    Как бы мог выглядеть исправленный вариант вашего кода?
    Например, так.

    let intervalId = null;
    
    $(window).on('scroll', function() {
      const scr = $(this).scrollTop();
      const elem = $('.count-wrapper').offset().top;
    
      if (scr > elem - 400 && !intervalId) {
        intervalId = setInterval(count, 10);
      }
    }).scroll();
    
    function count() {
      let countEnd = true;
    
      $('.count span').each(function() {
        const num = $(this).data('num');
        const currNum = $(this).text();
    
        if (currNum < num) {
          $(this).text(+currNum + 1);
          countEnd = false;
        }
      });
    
      if (countEnd) {
        clearInterval(intervalId);
      }
    }

    Ответ написан
    2 комментария