Главная > HTML, JavaScript, Программирование > Непересекающиеся выпадающие списки

Непересекающиеся выпадающие списки

22 Январь 2009

Что-то я все больше рассказываю о какой-то чепухе, навроде динамического создания полей в форме и совсем отошел от высокого - шаблонов проектирования. И эта статья к сожалению тоже не про них :( На этот раз я собираюсь рассказывать про selectbox'ы.

Для примера возьмем два selectbox'а и попробуем выбрах в них интервал времени. Допустим нам надо выбрать два месяца, да так чтоб месяц выбранный в первом шел раньше чем месяц выбранный во втором. Один и тот же месяц тоже желательно не выбирать, поэтому в первом нельзя выбрать декарь, а во втором - январь. И последние условие: если в первом selectbox'е выбрали месяц который идет после месяца, выбранного во втором, то во втором надо отметить месяц идущий за тем который выбрали в первом. В общем масло сливочное с растительным жареное на сале и маргарине, но я надеюсь вы поняли.

Итак нам как всегда понадобиться jQuery и немного уличной магии.



jQuery().ready(function($){
	$("select[name=first]").change(function(){
		var val = $(":selected",this).val(),
			col = $("select[name=second] option");
		col.show().each(function(){
			if ($(this).val() <= val)
				$(this).hide();
		})
		if(!col.filter(":selected").is(":visible"))
			col.filter(":visible:first").attr({selected:"selected"});
	}).change().find(":last").hide();
});

UPD Вообще у меня в хорошей традиции на следующий день после написания статьи вносить правки. Вот так и сегодня, я посмотрел свое творение под оперой и ослом и понял что надо что-то менять. Итак окончательный вариант:



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Непересекающиеся выпадающие списки</title>
<script src="jquery-1.3.2.js"></script>
<script>
jQuery().ready(function($){
	$("select[name=first]").change(function(){
		var val = $(":selected",this).val(),
			col = $("select[name=second] option");
		col.removeAttr("disabled").each(function(){
			if ($(this).val() <= val)
				$(this).attr({disabled:'disabled'});
		})
		if(col.filter(":selected").is(":disabled"))
			col.filter(":enabled:first").attr({selected:"selected"});
	}).change().find(":last").attr({disabled:'disabled'});
});
</script>
</head>
<body>
<form action="">

<select name="first">
<option value="101">Январь</option>
<option value="102">Февраль</option>
<option value="103">Март</option>
<option value="104">Апрель</option>
<option value="105">Май</option>
<option value="106">Июнь</option>
<option value="107">Июль</option>
<option value="108">Август</option>
<option value="109">Сентябрь</option>
<option value="110">Октябрь</option>
<option value="111">Ноябрь</option>
<option value="112">Декабрь</option>
</select>

<select name="second">
<option value="101">Январь</option>
<option value="102">Февраль</option>
<option value="103">Март</option>
<option value="104">Апрель</option>
<option value="105">Май</option>
<option value="106">Июнь</option>
<option value="107">Июль</option>
<option value="108">Август</option>
<option value="109">Сентябрь</option>
<option value="110">Октябрь</option>
<option value="111">Ноябрь</option>
<option value="112">Декабрь</option>
</select>

</form>

</body>
</html>

PS: хотя может стоило статью позиционировать как мануал по использованию псевдоселекторов?..

  1. 23 Январь 2009 в 16:44 | #1
    Почему нельзя "Январь-Январь"? Я юзал подобное в одном проекте, только мне еще надо было там подгружать инфу ajax'ом, там типа в зависимости от марки надо было подгрузить модели... А так же были месяцы, только я не хайдил их, а просто не выводил...
  2. 23 Январь 2009 в 20:49 | #2
    Если тебе нужен "Январь-Январь" поменяй "<=" на "<" и убери ".find(":last").hide()". Просто мне для сравнения не нужны были одинаковые месяцы.
  3. 24 Январь 2009 в 15:32 | #3
    Это понятно :) Кстати, поставь себе плагин http://txfx.net/code/wordpress/subscribe-to-comments/ а то приходиться вручную проверять камменты, а так бы приходили на мыло, я бы подписался.
  4. 24 Январь 2009 в 17:06 | #4
    ща поставлю
  5. 24 Январь 2009 в 17:21 | #5
    готово!
Комментирование отключено.