Экспромптум

Зависимости
<form>
	<p class="field">
		<label>Обязательное</label>
		<input data-xp="required: true"/>
	</p>
</form>

В зависимости от другого поля

<form>
	<label>Новый пароль</label>
	<input type="password" name="new_password"/>

	<label for="old_password">Старый</label>
	<input type="password" name="old_password" id="old_password" data-xp="required: '[name=new_password]'"/>
</form>

На определенное количество заполненных полей

<form>
	<div class="field options" data-xp="required: '[this] != 2'">
		<label>Мои интересы</label>
		<div class="comment"><small>Необходимо выбрать два пункта.</small></div>

		<div class="selector">
			<input type="checkbox" value="family" id="interest_1" name="interest">
			<label for="interest_1">семья</label>
		</div>

		<div class="selector">
			<input type="checkbox" value="job" id="interest_2" name="interest">
			<label for="interest_2">работа</label>
		</div>

		<div class="selector">
			<input type="checkbox" value="other" id="interest_3" name="interest">
			<label for="interest_3">остальное</label>
		</div>
	</div>
</form>
Необходимо выбрать два пункта.
<form>
	<label>Шаг 1</label>
	<input name="step_1"/>

	<label for="step_2">Шаг 2</label>
	<input name="step_2" id="step_2" data-xp="enabled: '[name=step_1]'"/>
</form>

Использование параметра values для выпадающего списка

<form>
	<label>Пол</label>
	<select name="sex">
		<option>мужской</option>
		<option>женский</option>
	</select>

	<label>Семейный статус</label>
	<select name="status_select" data-xp="
		enabled: [
													// можно перечислять значения в массиве
			{on: '[name=sex] == \'мужской\'', values: ['не женат', 'женат']},
													// или задать маску
			{on: '[name=sex] == \'женский\'', values: /муж/}
		]
	">
		<option>не замужем</option>
		<option>не женат</option>
		<option>замужем</option>
		<option>женат</option>
	</select>
</form>

Использование параметра values для комбобокса

<form>
	<label>Пол</label>
	<input name="sex" list="sex_id"/>
	<select name="sex_id" id="sex_id">
		<option>мужской</option>
		<option>женский</option>
	</select>

	<label>Семейный статус</label>
	<input name="status_select" list="status_select_id"/>
	<select name="status_select_id" id="status_select_id" data-xp="
		enabled: [
			{on: '[name=sex] == \'мужской\'', values: /жен/},
			{on: '[name=sex] == \'женский\'', values: /муж/}
		]
	">
		<option>не замужем</option>
		<option>не женат</option>
		<option>замужем</option>
		<option>женат</option>
	</select>
</form>

Использование параметра values для переключателей

<style>
	.hide_disabled .disabled {display: none;}
</style>

<form>
	<label>Пол</label>
	<select name="sex">
		<option>мужской</option>
		<option>женский</option>
	</select>

	<label>Семейный статус</label>
	<span class="field options hide_disabled" data-xp="
		enabled: [
											// также, как и для select-а, но с указанием to
			{on: '[name=sex] == \'мужской\'', to: '[name=status_radio]', values: ['не женат', 'женат']},
											// или только с использование to
			{on: '[name=sex] == \'женский\'', to: '[name=status_radio][value*=муж]'}
		]
	">
		<input type="radio" value="не замужем" name="status_radio" id="status_radio_1" checked="true"/>
		<label for="status_radio_1">не замужем</label>
		<input type="radio" value="не женат" name="status_radio" id="status_radio_2"/>
		<label for="status_radio_2">не женат</label>
		<input type="radio" value="замужем" name="status_radio" id="status_radio_3"/>
		<label for="status_radio_3">замужем</label>
		<input type="radio" value="женат" name="status_radio" id="status_radio_4"/>
		<label for="status_radio_4">женат</label>
	</span>
</form>

AJAX-загрузка пунктов для выпадающего списка

<form>
	<label>Город</label>
	<select name="city">
		<option value="msk">Москва</option>
		<option value="spb">Санкт-Петербург</option>
	</select>

	<label>Район (округ)</label>
	<select name="district"></select>
</form>

<script>
	(function(){
		xP();

		var city = xP('[name=city]').last(), district = xP('[name=district]').last();

		city.change(function(){
			var that = this, value = this.val();

			if(!this.loaded[value]){
				$.ajax({
					url: value + '.json',
					dataType: 'json',
					beforeSend: function(){
						that.loaded[value] = true;
					}
				}).done(function(data){
					district.append(data.result);

					new xP.dependencies.enabled({
						to: district,
						on: '[name=city] == "' + value + '"',
						values: data.result
					});
				});
			}
		}).loaded = {};
	})();
</script>

При заполнении всех required полей

<!-- По умолчанию параметр completed_on_required = true, при необходимости можно установить в false -->
<form data-xp="completed_on_required: true">
	<input data-xp="required: true" placeholder="обязательное"/>
	<input type="submit" value="Отправить" data-xp="enabled_on_completed: true"/>
</form>

При правильном заполнении всех required полей

<!-- По умолчанию параметр completed_on_valid_required = true, при необходимости можно установить в false -->
<form data-xp="completed_on_valid_required: true">
	<input data-xp="type: 'email', required: true" placeholder="обязательная эл. почта"/>
	<input type="submit" value="Отправить" data-xp="enabled_on_completed: true"/>
</form>

При правильном заполнении всех полей

<form data-xp="completed_on_valid: true">
	<input data-xp="type: 'email'" value="@design.ru"/>
	<input type="submit" value="Отправить" data-xp="enabled_on_completed: true"/>
</form>

При изменении хотя бы одного поля

<form data-xp="completed_on_changed: true">
	<input value="старое значение"/>
	<input type="submit" value="Отправить" data-xp="enabled_on_completed: true"/>
</form>
<style>
	.show_on_invalid {display: none}
	.invalid .show_on_invalid {display: inline}
</style>

<div class="field">
	<input name="email" data-xp="valid: /^[a-z]+$/i"/>
	<span class="show_on_invalid">только латинские буквы</span>
</div>
только латинские буквы

В зависимости от другого поля

<label>Контакт</label>
<input name="contact" data-xp="
	valid:
		'([name=contact_type].val().match(/телефон/i)'
		+ ' && [this].val().match('
		+ xP.controls.phone.prototype.valid
		+ ')) || ([name=contact_type].val().match(/эл\\. почта/i)'
		+ ' && [this].val().match('
		+ xP.controls.email.prototype.valid + '))'
"/>

<label>Тип</label>
<select name="contact_type">
	<option>Мобильный телефон</option>
	<option>Рабочий телефон</option>
	<option>Домашний телефон</option>
	<option>Персональная эл. почта</option>
	<option>Рабочая эл. почта</option>
</select>
<style>
	.hidden {display: none}
</style>

<select name="color">
	<option value="1">красный</option>
	<option value="2">зеленый</option>
</select>
<span data-xp="type: 'html', classed: {on: '[name=color] != 1', do: 'hidden'}">нельзя</span>
<span data-xp="type: 'html', classed: {on: '[name=color] != 2', do: 'hidden'}">можно</span>
нельзя можно
<input name="number_1" data-xp="type: 'number'" value="0"/>
<select name="operator">
	<option>+</option>
	<option>-</option>
	<option>*</option>
	<option>/</option>
</select>
<input name="number_2" data-xp="type: 'number'" value="0"/>
=
<span data-xp="
	type: 'html',
	computed:
		'[name=number_1]._format(\
			eval([name=number_1] + [name=operator] + [name=number_2])\
		)'
"></span>
=


Заказать дизайн...