Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Калькулятор расчета доставки (https://javascript.ru/forum/events/64040-kalkulyator-rascheta-dostavki.html)

qumo 16.07.2016 20:37

Калькулятор расчета доставки
 
Привет, ребята=) Возникло затруднение при написании скрипта калькулятора для расчета доставки.
Так: 0.5 кг = 2200 руб. и так на увеличение по +200 при увеличении инпута на 0.1, но не более 1кг; и -200 при уменьшении, но не менее 0.5кг. 1 кг = 3200 руб.
Не пойму как мне рассчитать это:D
вот мой "код":
<select name="method" class="find" onchange="question()">
  <option value="ems">ЕМS</option>
  <option value="avia">Авиа</option>
  <option value="sal">SAL</option>
  <option value="parohod">Пароход</option>
</select>

<input type="number" value="0.5" min="0.5" step="0.1" max="1" name="weight" id="weight" size="4">

<hr><span id="answer"></span> руб

var price = document.getElementById('answer'),
ems_price = '2,200';
avia_price = '2,500';
sal_price = '2,700';
parohod_price = '1,800';
price.innerHTML = ems_price;

function question() {
  var method = $('.find').val();
  switch(method){
    case 'ems':
      var weight = $('#weight').val();
      $('#weight').on('change', function() { // тут не важно, что событие здесь. Это я править буду потом=)
        alert(ems_price);
        if(weight > 0.5 && weight < 1){ // тут что-то другое, вероятнее всего. Я же делаю проверку "не ниже и не выше"=)
          price.innerHTML = ? - не могу рассчитать
	}
      });
    break;
//Далее тоже расчет по формулам будет=))
    case 'avia':
      price.innerHTML = avia_price;
    break;
    
    case 'sal':
      price.innerHTML = sal_price;
    break;
    
    case 'parohod':
      price.innerHTML = parohod_price;
    break;
  }
}

P.S.: для avia, sal и parohod не нужно ничего. я по примеру ems сделаю=)

рони 16.07.2016 21:34

qumo,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script>
$(function() {
var price = document.getElementById('answer'),
ems_price = 2200;
price.innerHTML = ems_price;
function question() {
  var method = $('.find').val();
  switch(method) {
    case 'ems':
      var weight = +$('#weight').val();
      var sum = ems_price;
        if(weight > 0.5 && weight <= 1){
       for (var i= 5 ; i< weight*10; i++)  {
           sum += 200
        };
            };
    price.innerHTML = sum;
    break;
//Далее тоже расчет по формулам будет=))
    case 'avia':
      price.innerHTML = avia_price;
    break;

    case 'sal':
      price.innerHTML = sal_price;
    break;

    case 'parohod':
      price.innerHTML = parohod_price;
    break;
  }
  }
$('#weight').on("input", question);
$('.find').on("change", question);
});
  </script>
</head>

<body>
<select name="method" class="find" >
  <option value="ems">ЕМS</option>
  <option value="avia">Авиа</option>
  <option value="sal">SAL</option>
  <option value="parohod">Пароход</option>
</select>

<input type="number" value="0.5" min="0.5" step="0.1" max="1" name="weight" id="weight" size="4" >

<hr><span id="answer"></span> руб


</body>
</html>

qumo 16.07.2016 21:53

Спасибо, Рони, огромное!=) смотрю, я практически и не наг#вн#кодил=))

qumo 16.07.2016 22:09

Проблема небольшая=) пропускает значение 2800=)

рони 16.07.2016 22:25

Цитата:

Сообщение от qumo
пропускает значение 2800=)

исправил

qumo 16.07.2016 22:31

Спасибо за ответ=) Теперь он 3200 не делает на 1кг, а когда в обратную делаешь, то 0.5 = 2400, а не 2200=)

рони 16.07.2016 22:34

qumo,
пропишите нужные условия

qumo 16.07.2016 22:40

Вот же спасибо огромнейшее=) Спасибо, Рони, что ты есть!=)

рони 16.07.2016 22:41

Цитата:

Сообщение от qumo
то 0.5 = 2400, а не 2200=)

выше это исправлено

рони 16.07.2016 22:43

Цитата:

Сообщение от qumo
Теперь он 3200 не делает на 1кг,

добавлено

qumo 16.07.2016 23:21

спасибо, а не мог бы ты мне объяснить эту часть? Почем тут именно так?
for (var i= 5 ; i< weight*10; i++)  {
           sum += 200 // тут увеличиваем на 200 переменную sum
        };

рони 16.07.2016 23:25

qumo,
потому что в js
.2 + .1 !== .3 отсюда все ошибки моего первоначального варианта
alert(.2+.1);

зато 1 + 2 == 3
alert(2+1);

qumo 16.07.2016 23:35

спасибо, прикольно=)) но я не понял: почему $i поставил именно со значением 5?=) почему умножение веса идет именно на 10?=)

рони 16.07.2016 23:49

Цитата:

Сообщение от qumo
но я не понял: почему $i поставил именно со значением 5?=) почему умножение веса идет именно на 10?=)

:-? вроде попытался обьснить ... чтоб работать с целыми числами

qumo 17.07.2016 23:11

все равно не понимаю, почему var i = 5 и вес * на 10. Понятно, что вес будет целым числом и i тоже, но как js правильно "понимает", что нужно передать именно 200 при увеличении и -200 при уменьшении(переменная sum это понятно, тут другой сути вопрос)=) а что если бы была не от 0.5, а от 1.25(или еще как-то) до, например, 2. Как этот цикл смог на это повлиять=)

рони 17.07.2016 23:29

Цитата:

Сообщение от qumo
и -200 при уменьшении

код выше этого никогда не делает :) но в результате именно так и выглядит.

рони 17.07.2016 23:33

Цитата:

Сообщение от qumo
не от 0.5, а от 1.25(или еще как-то) до, например, 2.

тогда i = 125 и weight*100...

qumo 17.07.2016 23:46

Цитата:

Сообщение от рони (Сообщение 422383)
код выше этого никогда не делает :) но в результате именно так и выглядит.

А почему именно так выходит?=) из-за if-а?=)
Цитата:

Сообщение от рони (Сообщение 422383)
тогда i = 125 и weight*100...

И это независимо от того, сколько будет прибавляться к sum?

рони 17.07.2016 23:54

Цитата:

Сообщение от qumo
И это независимо от того, сколько будет прибавляться к sum?

это если нужна точность до сотых
Цитата:

Сообщение от qumo
1.25


рони 17.07.2016 23:58

qumo,
нужно 6 шагов -- какая разница будет это 0.5 0.6 ... 1
или 5 ... 6 .... 10 ... всё пас обьяснять

qumo 17.07.2016 23:59

Цитата:

Сообщение от рони (Сообщение 422386)
это если нужна точность до сотых

Сейчас попробовал, расчет что-то неверный=) при i = 125 и weight * 100 =)

qumo 18.07.2016 00:05

Цитата:

Сообщение от рони (Сообщение 422387)
qumo,
нужно 6 шагов -- какая разница будет это 0.5 0.6 ... 1
или 5 ... 6 .... 10 ... всё пас обьяснять

воооо...теперь дошло:D

qumo 18.07.2016 01:38

А почему при следующем if sum вновь сбрасывается на 2200?
case 'ems':
  var weight = +$('#weight').val();
  var sum = ems_price;
  if(weight > 0.4 && weight <= 1){
    for (var i= 50; i< weight*100; i++) {
      sum += 20;
    };
    price.innerHTML = sum;
  };
  if(weight => 1 && weight <= 2){
    for (var i = 100; i< weight * 100; i++) {
      sum += 18;
    };
    price.innerHTML = sum;
  };
break;

Botik21 18.07.2016 08:57

weight => 1
почему вас синтаксический анализатор подальше не послал? :)

рони 18.07.2016 10:11

Цитата:

Сообщение от qumo
почему

что хотите сделать? где описание, параметры?

qumo 18.07.2016 17:09

Цитата:

Сообщение от Botik21 (Сообщение 422401)
почему вас синтаксический анализатор подальше не послал? :)

:blink: :lol: мдаааа...ну я выдал :D от массива в php=))

qumo 18.07.2016 17:13

Цитата:

Сообщение от рони (Сообщение 422406)
что хотите сделать? где описание, параметры?

Ну я думал по вашему примеру и дальше продолжить делать увеличение переменной sum, но уже на другую сумму. Код тот же, только добавил if и for после вашего if и for=))

qumo 18.07.2016 17:21

Немного отредактировал
$(function() {
			    var price = document.getElementById('answer'),
			    ems_price = 2200;
				avia_price = 2500;
			    sal_price = 2700;
			    parohod_price = 1800;
				price.innerHTML = ems_price;
				
				function question() {
				  var method = $('.find').val();
				  switch(method) {
					case 'ems':
					  var weight = +$('#weight').val();
					  var sum = ems_price;
					  if(weight >= 0.5 && weight <= 1){
					    for (var i= 50; i< weight*100; i++)  {
						  sum += 20;
						};
					    price.innerHTML = sum;
					  };
					  if(weight >= 1.25 && weight <= 2){
					    for (var i = 125; i< weight * 100; i++)  {
						   sum += 24;
						};
						price.innerHTML = sum;
					  };
					break;
					
					case 'avia':
					  price.innerHTML = avia_price;
					break;
					
					case 'sal':
					  price.innerHTML = sal_price;
					break;
					
					case 'parohod':
					  price.innerHTML = parohod_price;
					break;
				  }
				}
				$('#weight').on("change", question);
				$('.find').on("change", question);
			  });

рони 18.07.2016 17:31

qumo,
если есть вопросы, то пост 25

qumo 18.07.2016 18:24

сейчас мне нужно от 1.25 до 2 по 0.01 увеличивать предыдущий sum на 24=) но предыдущий sum, при достижении 1.25 вновь сбрасывается до 2200=(

рони 18.07.2016 18:37

qumo,
а куда делось от 1 до 1.25 и каким образом изменился шаг с 0.1 до 0.01 -- эти чудеса как-то разъяснить треба?!

qumo 18.07.2016 18:42

Цитата:

Сообщение от рони (Сообщение 422465)
qumo,
а куда делось от 1 до 1.25 и каким образом изменился шаг с 0.1 до 0.01 -- эти чудеса как-то разъяснить треба?!

Это я изменил. Извиняюсь, что не предупредил об изменениях:-? :( это требуется для точности при вводе, чтобы было до сотых - за каждый грамм=)

рони 18.07.2016 19:09

Цитата:

Сообщение от qumo
Это я изменил.

а что и как вы изменили?пока ни ваши обяснения, ни код, не о чём не говорят.

qumo 18.07.2016 20:10

$(function() {
    var price = document.getElementById('answer'),
    ems_price = 2200;
    avia_price = 2500;
    sal_price = 2700;
    parohod_price = 1800;
    price.innerHTML = ems_price;
				
    function question() {
      var method = $('.find').val();
      switch(method) {
	case 'ems':
	var weight = +$('#weight').val();
	var sum = ems_price;
	if(weight >= 0.5 && weight <= 1){ // было weight => 0.5
	  for (var i= 50; i< weight*100; i++)  { //было var i = 5 и weight * 10
            sum += 20; // было sum += 200
	  };
	  price.innerHTML = sum;
        };
        if(weight >= 1.25 && weight <= 2){ //Добавил
          for (var i = 125; i< weight * 100; i++)  {
            sum += 24;
          };
          price.innerHTML = sum;
        }; //Конец добавленного
      break;
      case 'avia':
        price.innerHTML = avia_price;
      break;
      case 'sal':
        price.innerHTML = sal_price;
      break;
      case 'parohod':
        price.innerHTML = parohod_price;
      break;
    }
  }
  $('#weight').on("change", question);
  $('.find').on("change", question);
});

рони 18.07.2016 20:13

qumo,
вопрос тот же где пропавший диапазон и строку 19 выкинуть , а строку 25 перенести в конец 26.

qumo 18.07.2016 20:37

Цитата:

Сообщение от рони (Сообщение 422482)
qumo,
вопрос тот же где пропавший диапазон и строку 19 выкинуть , а строку 25 перенести в конец 26.

Я довел до сотых, вместо десятых. от 0.5 по шагу в 0.01 до 1кг = 50 шагов. Это от 2200 до 3200, отсюда: 3200-2200=1000. Далее 1000/50=20. 20 и есть сумма из 200, но уже не на каждых 100 грамм, а на каждый 1грамм=) во втором случае: от 1.25 до 2кг = 75 шагов=) Это от 3200 до 5000. Тут такой же расчет=) Но тут у меня sum сбрасывается до 2200 во втором цикле, когда weight >= 1.01, на 1.25 начинает прибавлять к 2200, как и должно быть. Я предполагаю, что это из-за того диапазона, который между 1 и 1.25, он как бы блуждающий, не?=)

qumo 18.07.2016 20:56

ой, видимо, вы про него и говорили - "пропавший диапазон", да?=)))

рони 18.07.2016 21:33

qumo,
$(function() {
    var res = document.getElementById("answer"),
        price = {
            "ems": 2200,
            "avia": 2500,
            "sal": 2700,
            "parohod": 1800
        };
    res.innerHTML = price["ems"];

    function question() {
        var method = $(".find").val();
        var weight = +$("#weight").val();
        var sum = price[method];
        switch (method) {
            case "ems":
                if (weight >= .5 && weight <= 1)
                    for (var i = 50; i < weight * 100; i++) sum += 20;
                else if (weight > 1 && weight < 1.25){ /* где? */ }     
                else if (weight >= 1.25 && weight <= 2)
                    for (var i = 125; i < weight * 100; i++) sum += 24;
                break;
            case "avia":
                break;
            case "sal":
                break;
            case "parohod":
                break
        }
        res.innerHTML = sum
    }
    $("#weight").on("change", question);
    $(".find").on("change", question)
});

qumo 18.07.2016 22:53

значит я правильно понял вас:)

qumo 19.07.2016 00:05

берет после 1.01 с 2200, а не с 3200=((
$(function() {
			    var res = document.getElementById("answer"),
			    price = {
					"ems": 2200,
					"avia": 2500,
					"sal": 2700,
					"parohod": 1800
				};
				res.innerHTML = price["ems"];

				
				function question() {
				  var method = $(".find").val();
				  var weight = +$("#weight").val();
				  var sum = price[method];
				  switch(method) {
					case 'ems':
					  if (weight >= .5 && weight <= 1){
						for (var i = 50; i < weight * 100; i++) {sum += 20;}
					  }
					  else if (weight > 1 && weight <= 2){
						for (var i = 100; i < weight * 100; i++) {sum += 18;}
					  }
					break;
					
					case 'avia':
					  price.innerHTML = avia_price;
					break;
					
					case 'sal':
					  price.innerHTML = sal_price;
					break;
					
					case 'parohod':
					  price.innerHTML = parohod_price;
					break;
				  }
				  res.innerHTML = sum
				}
				$('#weight').on("change", question);
				$(".find").on("change", question);
			  });


Часовой пояс GMT +3, время: 00:54.