Счетчик путевых точек подсчитывает вверх (затем вниз) и не выполняет скрипт, когда div находится в режиме немедленного просмотра - PullRequest
2 голосов
/ 07 октября 2019

У меня есть номер, который считает. Для демонстрационных целей это , как счетчик должен работать . Он подсчитывает, а затем останавливается.

Теперь я пытаюсь заставить сценарий тикера выполняться, когда отображается #ticker. Для этого я использую waypoints. Однако у меня возникают следующие проблемы:

  1. Сценарий не выполняется, как только появляется #ticker. На самом деле, я должен прокрутить мимо него, а затем, когда я прокручиваю вверх, он начинает считать.
  2. Счетчик считает, набирает конечный номер, а затем начинает считать? Я просто хочу, чтобы он сосчитал и остановился на конечном числе плюс строка (в данном случае это 16 000+).

Почему это происходит?

Демонстрация:

$(document).ready(function() {

  $('#ticker').waypoint(function() {
    $('.count').each(function() {
      const initial = $(this).text()
      const format = formatter(initial)
      $(this).prop('Counter', 0).animate({
        Counter: format.value
      }, {
        duration: 3000,
        easing: 'swing',
        step: function(now) {
          $(this).text(format.revert(Math.ceil(now)));
        }
      });
    });
  });

})

function formatter(str) {
  // const delimeter = '-'
  const char = 'x'
  const template = str.replace(/\d/g, char)
  const value = str.replace(/\D/g, '')

  function revert(val) {
    // need better solution
    const valStr = val.toString()
    let result = ''
    let index = 0
    for (let i = 0; i < template.length; i++) {
      const holder = template[i]
      if (holder === char) {
        result += valStr.slice(index, index + 1)
        index++
      } else {
        result += holder
      }
    }
    return result
  }
  return {
    template: template,
    value: value,
    revert: revert
  }
}
.gap{
  background: lightgrey;
  height: 600px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/waypoints/4.0.1/jquery.waypoints.min.js"></script>

<div class="gap"></div>
<div id="ticker">
  <span class="count counter">16,000+</span>
</div>
<div class="gap"></div>

1 Ответ

1 голос
/ 07 октября 2019

Плагин Waypoint имеет опцию offset, которая определяет, в каком положении должен быть запущен обработчик, что по умолчанию 0. Это означает, что ваш обработчик будет срабатывать только тогда, когда ваш элемент достигает верхнего края браузера, и будет срабатывать каждый раз, когда ваш элемент достигает верхнего края браузера.

Это то, что происходит в вашем случае, вам просто нужнопередать смещение к путевой точке, и оно будет зафиксировано.

$(document).ready(function() {
  $('#ticker').waypoint({
    handler: function() {
      $('.count').each(function() {
        const initial = $(this).text()
        const format = formatter(initial)
        $(this).prop('Counter', 0).animate({
          Counter: format.value
        }, {
          duration: 3000,
          easing: 'swing',
          step: function(now) {
            $(this).text(format.revert(Math.ceil(now)));
          }
        });
      });
    },
    offset: '100%'
  });
})

function formatter(str) {
  // const delimeter = '-'
  const char = 'x'
  const template = str.replace(/\d/g, char)
  const value = str.replace(/\D/g, '')

  function revert(val) {
    // need better solution
    const valStr = val.toString()
    let result = ''
    let index = 0
    for (let i = 0; i < template.length; i++) {
      const holder = template[i]
      if (holder === char) {
        result += valStr.slice(index, index + 1)
        index++
      } else {
        result += holder
      }
    }
    return result
  }
  return {
    template: template,
    value: value,
    revert: revert
  }
}
.gap{
  background: lightgrey;
  height: 600px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/waypoints/4.0.1/jquery.waypoints.min.js"></script>

<div class="gap"></div>
<div id="ticker">
  <span class="count counter">16,000+</span>
</div>
<div class="gap"></div>
...