Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   4 взаимозависимых числовых select'a (https://javascript.ru/forum/dom-window/52694-4-vzaimozavisimykh-chislovykh-select%27.html)

Symba87 01.01.2015 19:32

4 взаимозависимых числовых select'a
 
С Новым годом, уважаемые форумчане!
Немного пошарив по форуму и просторам ру (и не только) нета, не смог разобраться с, казалось бы, простой задачкой. Оговорюсь сразу, что я только знакомлюсь с js, одновременно решаю реальную задачу, для реального проекта.
Суть задачи:
1. на форме имеем 4 <select> с <option> у первого со значениями от 1 до 9, у второго и третьего - от 0 до 8, у четвертого - от 0 до 2.
2. нужно отследить, чтоб при отправке формы (submit()) сумма значений всех 4 <select> не превышала 9.
3.Количество опций в селектах должно быть взаимозависимым, то есть при выборе в первом, например, значения 4, в остальных нужно запретить выбор значения, превышающего 5, дабы не превысить общей суммой число 9.

Конкретный пример - форма заказа авиабилета с категориями пассажиров (Взрослый, подросток, младенец, младенец без отдельно предоставленного места), естественно, сумма пассажиров в заказе не должна превысить 9.

Буду признателен любым подсказкам.
Спасибо!

рони 01.01.2015 19:47

Symba87,
:blink:
http://javascript.ru/forum/dom-windo...-v-select.html

Symba87 01.01.2015 20:36

Цитата:

Сообщение от рони (Сообщение 349158)

Просто, иногда не хватает хорошего пинка в нужную сторону!
Спасибо!:D
Ограничился пока что 3 селектами, вроде работает.:dance:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
</head>

<body>
<select>
                      <option value="1" selected>1</option>
                      <option value="2">2</option>
                      <option value="3">3</option>
                      <option value="4">4</option>
  	              <option value="5">5</option>
                      <option value="6">6</option>
                      <option value="7">7</option>
                      <option value="8">8</option>
                      <option value="9">9</option>

 </select>
 <select>
                      <option value="0" selected>0</option>


 </select>
  <select>
                      <option value="0" selected>0</option>


 </select>

<script>
var select0 = document.getElementsByTagName('select')[0];
var select1 = document.getElementsByTagName('select')[1];
var select2 = document.getElementsByTagName('select')[2];

    select0.addEventListener('change', function() {
        var i = this.selectedIndex;
        select1.options.length=0
        select2.options.length=1
        for (var k=0; k<9-i; k++)  {
           select1.options[k] = new Option(k, k);
        }
		select1.addEventListener('change', function() {
			var i = this.selectedIndex + select0.selectedIndex;
			select2.options.length=1
			for (var k=0; k<9-i; k++)  {
				select2.options[k] = new Option(k, k);
			}
		});
    });
</script>
</body>
</html>

bes 01.01.2015 22:35

Цитата:

Сообщение от Symba87
Суть задачи:
1. на форме имеем 4 <select> с <option> у первого со значениями от 1 до 9, у второго и третьего - от 0 до 8, у четвертого - от 0 до 2.
2. нужно отследить, чтоб при отправке формы (submit()) сумма значений всех 4 <select> не превышала 9.
3.Количество опций в селектах должно быть взаимозависимым, то есть при выборе в первом, например, значения 4, в остальных нужно запретить выбор значения, превышающего 5, дабы не превысить общей суммой число 9.

Конкретный пример - форма заказа авиабилета с категориями пассажиров (Взрослый, подросток, младенец, младенец без отдельно предоставленного места), естественно, сумма пассажиров в заказе не должна превысить 9.

<div></div>
<script>
function createDependableSelects(obj) {
	obj.selectPointsArray.map(function(spa, index, mas) {
		spa.select = document.createElement("select");
		for ( var i = 0, length = spa.end - spa.start + 1; i < length; i++ ) {
			spa.select.options[i] = new Option(spa.start++);
		}
		obj.parent.appendChild(spa.select);
		spa.select.addEventListener("change", function () {
			var amount = 0;
			mas.map(function (value) {
				amount += value.select.selectedIndex;
			});
			if (amount >= obj.sum) {
				this.selectedIndex = 0; 
				alert("too much");
			}
		});
	});
}

//usage
createDependableSelects({
	selectPointsArray: [
			{start: 1, end: 9},
			{start: 0, end: 8},
			{start: 0, end: 8},
			{start: 0, end: 2}
		],
	parent: document.querySelector("div"),
	sum: 9
});
</script>


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