Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Калькулятор доставки по регионам РФ (https://javascript.ru/forum/dom-window/64118-kalkulyator-dostavki-po-regionam-rf.html)

JimHudson 21.07.2016 13:48

Вложений: 2
Вот собственно результат. Напомню что сайт на платформе Ucoz

JimHudson 21.07.2016 13:53

Загрузчик не о чем
 
http://uchudesami.ru/rezult.png
http://uchudesami.ru/rezult2.png

Вот результаты труда. Как мне сделать взаимосвязь функции и <select>???

Rise 21.07.2016 19:04

JimHudson,
<select name="region" onchange="regionChange(this)">
	<option value="0">Выберите регион доставки</option>
	<option value="300">Красноярский край</option>
	<option value="200">Ленинградская область</option>
	<option value="200">Московская область</option>
	<option value="300">Омская область</option>
	<option value="650">Другой</option>
</select>

<script>
function regionChange(region) {
	alert(region.value);
}
</script>

JimHudson 21.07.2016 19:23

спасибо огромное, но проблема еще не решена.последнии три строчки моей функции


if($('input[name="custom_delivery_tax"]').length == 0
$('#checkout-form').append('<input type="hidden" name="custom_delivery_tax" value="0">');

}

$('input[name="custom_delivery_tax"]').val(cost);

добавляют числовой результат в общую стоимость заказа.

как мне их применить? нужно решение без alert.
и как функцию js подключить из внешнего файла?

warren buffet 22.07.2016 06:43

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

var costs={},
    Cost; /* выбранный регион */

costs.msk={
   name:Мозгва,
   0:970,
   1:100,
   12:300,
   31:0
};

costs.nsk={
   name:Новосибирск
   0:670,
   1:200,
   12:500,
   31:0
};

/* продолжай копипастить и менять цены по дням для рыгиона */

costs.spb={
   name:Питербурх
   0:170,
   1:600,
   12:600,
   31:1
};

Cost=costs.msk; /* дефаульт сити  */



Теперь делаешь список

var html=[];

for(var item in costs)
   html.push('<option value="'+key+'"'+((costs[key]===Cost)?' selected':'')+'>'+costs[key].name+'</option>';

some_elem.innerHTML='<select>'+html.join('')+'</select>';
some_elem.addEventListener('change',calc);



Теперь калькируешь

var calc=function(e){

    /* если есть такой регион, то взять, иначе в мозгву, или какой-то дефольт */

    var region = (costs.hasOwnProperty(this.value))?costs[this.value]:costs.msk

    /* в var today; номер дня, если не твой день, то дефолт */

    Cost = region.hasOwnProperty(today)?cost[today]:cost[0];

};



Всенах.

warren buffet 22.07.2016 06:47

ЗЫ. Таблица ненормальна, но тут уловки: номер дня - это число, значит топоним можно заеписать через текстовый ключ, прямо в отношение и вторая - нулевого дня не бывает, поэтому дефолт в пишется в 0, кроме того к 0 эволюционируют все пустые значения.

warren buffet 22.07.2016 07:50

Заделал рабочий прототип

<!DOCTYPE html>
<html lang="ru" dir="ltr">
<head>
<meta charset="utf-8">
</head>
<body>


<div><input type="text" id="day" value="1"/></div>
<br/>
<div id="list"></div>
<br/>
<button id="btn">Посчитать</button>
<br/>
<div id="result"></div>

<script>

var costs={},
	today,
    Cost;

costs.msk={
   name:'Мозгва',
   '0':970,
   '1':100,
   '12':300,
   '31':0
};

costs.nsk={
   name:'Новосибирск',
   '0':670,
   '1':200,
   '12':500,
   '31':0
};

costs.spb={
   name:'Питербурх',
   '0':170,
   '1':600,
   '12':600,
   '31':1
};


var html=[];

for(var key in costs)
   html.push('<option value="'+key+'"'+(costs[key]===Cost?' selected':'')+'>'+costs[key].name+'</option>');

document.getElementById('list').innerHTML='<select>'+html.join('')+'</select>';

var calc=function(e){

    /* если есть такой регион, то взять, иначе в мозгву, или какой-то дефольт */

    var region = (costs.hasOwnProperty(this.value))?costs[this.value]:costs.msk
	
	today=document.getElementById('day').value;	
	
    Cost = region.hasOwnProperty(today)?region[today]:region[0];

};

var show=function(){
	document.getElementById('result').innerHTML='<p>Сегодня цена доставки: '+Cost + ' руб.';
};


document.getElementById('btn').addEventListener('click',show);

list.querySelector('select').addEventListener('change',calc);

today=document.getElementById('day').value;

Cost=costs.msk[today]; /* дефаульт сити  */

</script>

</body>
</html>

JimHudson 22.07.2016 10:45

warren buffet,
спасибо, опять не то. меня по ходу никто не понял. ты есть вконтакте? скинь в личку ссылку

JimHudson 22.07.2016 10:58

Вот исходная функция.
var myCalculator = function(day){
 // стоимость доставки
 var cost = 0;
 switch(day) {
 // каждое первое число месяца стоимость равна 100у.е.
 case 1: cost = 100; break 
 // каждое двенадцатое число месяца стоимость равна 200у.е.
 case 12: cost = 200; break
 // каждое тридцать первое число месяца доставка бесплатна (таких дней всего 7 в году)
 case 31: cost = 0; break
 // по остальным дням мы не так щедры, доставка 500у.е.
 default: cost = 500;
 }
 // если поле custom_delivery_tax не существует
 if($('input[name="custom_delivery_tax"]').length == 0){
 // добавить его
 $('#checkout-form').append('<input type="hidden" name="custom_delivery_tax" value="0">');
 }
 // запись стоимости доставки в поле custom_delivery_tax
 $('input[name="custom_delivery_tax"]').val(cost);
}


она считает стоимость доставки в зависимости от дня месяца.

мне необходимо ее переделать, чтобы она считала стоимость в зависимости от региона.

например:
в функции прописать
регион 1, регион 2, регион 3= 200руб
регион 4, регион 5 =300 руб
регион 6 = 400 руб
и т.д.
за счет <select> создаем динамический список регионов.

покупатель выбирает свой регион из списка, а скрипт сравнивает соответствие регион-стоимость и выводит покупателю стоимость доставки, плюс прибавляет ее к общей стоимости. Роль прибавления стоимости выполняют три последние строки исходной функции.


комментарии написанные в исходной функции динамим, они для расчета по дням, нам нужно по регионам.

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

JimHudson 22.07.2016 11:37

Rise,
с юкозом имел дело?


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