jQuery: изменить var при нажатии

У меня есть круговой индикатор выполнения, и я хочу обновить его (и его диапазон со значениями) при нажатии на div. Щелчок должен добавить значение ввода к var. Я создал небольшой превью этого. Моя проблема в том, что var не меняется при нажатии. Кто-нибудь может помочь? Спасибо!

var calories = 1000;
var total = 2500;
var percentage = calories / total;
var pluscal = $('#quantity').val();
var span = $('#today-progress span').html(calories + '/' + total);


/* setInterval(() => {
  calories = 0
}, 1000 * 60 * 60 * 24);
var today = new Date().getTime();
localStorage.setItem("today", today); */


$('#confirm-svg').click(function() {
  calories = calories + pluscal;
  $('#today-progress').circleProgress();
});


$('#today-progress').circleProgress({
  value: percentage,
  size: 300.0,
  startAngle: -1.57,
  thickness: 'auto',
  fill: {
    gradient: ['#CE6363', '#B23939'],
  },
  emptyFill: '#D6A0A0',
  animation: {
    duration: 3000,
    easing: 'circleProgressEasing'
  },
  animationStartValue: 0.0,
  reverse: false,
  lineCap: 'round',
});
body {
  font-family: Helvetica, sans-serif;
}

#today-progress {
  z-index: 0;
  position: relative;
  top: 10px;
  text-align: center;
}

#today-progress span {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  text-align: center;
  font-size: 45px;
}

svg {
  width: 30px;
  height: 30px;
  margin: 5px 10px;
  float: right;
  fill: #000;
}

svg:active {
  fill: red;
}

form {
  margin-top: 20px;
  margin-left: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://rawgit.com/kottenator/jquery-circle-progress/1.2.2/dist/circle-progress.js"></script>
<div id="today-progress">
  <span></span>
</div>

<form>
  Quantity (between 1 and 1000):
  <input type="number" id="quantity" min="1" max="1000">
</form>

<div id="confirm-svg">
  <svg id="confirm-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" width="512px" height="512px" viewBox="0 0 305.002 305.002" style="enable-background:new 0 0 305.002 305.002;"
  xml:space="preserve">
    <g>
      <g>
        <path d="M152.502,0.001C68.412,0.001,0,68.412,0,152.501s68.412,152.5,152.502,152.5c84.089,0,152.5-68.411,152.5-152.5    S236.591,0.001,152.502,0.001z M152.502,280.001C82.197,280.001,25,222.806,25,152.501c0-70.304,57.197-127.5,127.502-127.5    c70.304,0,127.5,57.196,127.5,127.5C280.002,222.806,222.806,280.001,152.502,280.001z"
        />
        <path d="M218.473,93.97l-90.546,90.547l-41.398-41.398c-4.882-4.881-12.796-4.881-17.678,0c-4.881,4.882-4.881,12.796,0,17.678    l50.237,50.237c2.441,2.44,5.64,3.661,8.839,3.661c3.199,0,6.398-1.221,8.839-3.661l99.385-99.385    c4.881-4.882,4.881-12.796,0-17.678C231.269,89.089,223.354,89.089,218.473,93.97z"
        />
      </g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
    <g>
    </g>
  </svg>
</div>

(JSFiddle здесь) Кроме того, если возможно, я хотел бы сбросить эту переменную (калории) на 0 каждые 24 часа, вы можете увидеть мою жалкую попытку сделать это в комментарии к js-коду. Если вы можете помочь мне с этим, это тоже было бы здорово :)


person Maëlle    schedule 16.08.2017    source источник


Ответы (3)


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

Кроме того, вы должны разобрать значение из поля ввода и вызвать circleProgress() со всеми настройками, необходимыми для перерисовки материала круга. Как у вас сейчас, настроек нет.

Что-то вроде следующего для начала: см. JSFiddle здесь

$('#confirm-svg').click(function() {
  // Every time you click, you should parse the integer from the input,
  // then add that to the sum of calories.
  calories = calories + parseInt($('#quantity').val(), 10);
  percentage = calories / total; 

  // Then you have to update the calories mark with the new value of calories
  $('#today-progress span').html(calories + '/' + total);
  // Then you have to redraw the circle stuff
  drawCircle()
});

function drawCircle() {
  $('#today-progress').circleProgress({
    value: percentage,
    size: 300.0,
    startAngle: -1.57,
    thickness: 'auto',
    fill: {
      gradient: ['#CE6363', '#B23939'],
    },
    emptyFill: '#D6A0A0',
    animation: {
      duration: 3000,
      easing: 'circleProgressEasing'
    },
    animationStartValue: 0.0,
    reverse: false,
    lineCap: 'round',
  });
}

// Draw the initial circle
drawCircle();
person nbkhope    schedule 16.08.2017
comment
Большое спасибо! Это сработало, я совершенно забыл о необходимости parseInt. Я добавил обновление изменения диапазона в функцию drawCircle, так что есть только эта функция для вызова, но вы решили ее, спасибо :) - person Maëlle; 17.08.2017
comment
Извините, я хотел принять ваш ответ, но проблема со сбросом все еще не исправлена, и если я приму его, никто не будет на него смотреть, я приму его позже, если вы согласны - person Maëlle; 17.08.2017
comment
@MaëlleJumel, вы можете установить тайм-аут для его сброса через 24 часа, но кто будет ждать на вашем сайте 24 часа только для этого? Если вы говорите о постоянном хранилище, то это нечто совершенно другое и требует серверной базы данных для хранения ваших данных. Внешний интерфейс связан только с представлением и должен получать данные откуда-то еще. Он просто отображает данные в удобном и удобном формате. - person nbkhope; 17.08.2017

В твоей скрипке я добавил...

setInterval(() => {
    calories = 0;
    $('#today-progress').circleProgress();
}, 5000);

И он сбрасывает его каждые 5 секунд с анимацией. Не считая 5 секунд против 24 часов, это то, что вам нужно?

person Taplar    schedule 16.08.2017
comment
Привет, спасибо за ответ! Это то, что я ищу, но var не возвращается к 0? Также знаете ли вы, что с вашим кодом значение останется прежним при обновлении, что означает, что интервал не начнется снова? - person Maëlle; 17.08.2017
comment
@MaëlleJumel Я думаю, вам не хватает некоторых основных концепций веб-разработки. Во внешнем интерфейсе нет ничего постоянного, если вы обновите страницу, она вернется в исходное состояние. Да, вы можете попробовать использовать локальное хранилище, но оно доступно только пользователю приложения. Чтобы иметь настоящее постоянное хранилище, вам необходимо изучить концепцию серверной части и баз данных. Все, что вы видите во внешнем интерфейсе, — это не что иное, как удобное представление данных, полученных откуда-то еще. Короче говоря, интерфейс всегда сначала получает некоторые данные с сервера, а затем отображает их в удобном для человека формате. - person nbkhope; 17.08.2017
comment
Да, я хотел бы сделать его настоящим постоянным хранилищем, мне нужно узнать об этом. Извините, я действительно совсем не эксперт, я узнал только основные вещи, создавая черновики веб-сайтов (HTML/CSS/JS), но никогда не создавал настоящий сайт с доменом и фактическими данными @nbkhope - person Maëlle; 17.08.2017

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

var now = new Date();
    var millisTill10 = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 10, 0, 0, 0) - now;
    if (millisTill10 < 0) {
         millisTill10 += 86400000; // it's after 10am, try 10am tomorrow. 10 is my number
    }
    setTimeout(function(){var calories = 0;}),

Дайте мне знать, как это работает. (Пока не голосуйте против) Получайте удовольствие от кодирования ;-) .

person Mwangi Thiga    schedule 18.08.2017
comment
Эй, спасибо! Хотя это похоже на другие ответы, это будет работать, только если вы не перезагрузите страницу? - person Maëlle; 18.08.2017
comment
Ага. Как именно вы хотите, чтобы ваше приложение работало? - person Mwangi Thiga; 18.08.2017
comment
Вы можете создать простой PHP-скрипт, который позаботится о времени. Это позаботится об обновлении страницы. Дайте мне знать, если вам нужна помощь с этим. - person Mwangi Thiga; 18.08.2017
comment
Я собираюсь изучить эту вещь PHP, спасибо. Я дам вам знать, если я потеряюсь :) - person Maëlle; 18.08.2017
comment
Прохладно. Всего наилучшего - person Mwangi Thiga; 18.08.2017