У меня возникают проблемы с созданием кода. Я пытаюсь показать/скрыть div на основе выбора варианта выбора, в общей сложности 4 варианта.
Есть два элемента выбора
<select>
<option value="value1">Value 1</option>
<option value="value2">Value 2</option>
</select>
<select>
<option value="value3">Value 3</option>
<option value="value4">Value 4</option>
</select>
Комбинации были бы
value1-value3 value1-value4
value2-value3 value2-value4
Второй элемент select пуст, пока вы не выберете из первого элемента select, а затем вы сможете выбрать из второго элемента и отобразить div для этого значения.
Дива будет.
<div id="value-1-3">value1-value3</div>
<div id="value-1-4">value1-value4</div>
<div id="value-2-3">value2-value3</div>
<div id="value-2-4">value2-value4</div>
Можете ли вы, ребята, помочь мне сделать это?
Я бы дал некоторые идентификаторы вашим selects
, для этого примера, можно использовать sel1
и sel2
соответственно. Я бы также изменил value
в option
чтобы просто быть числом, иначе потребуется некоторое обрезка value
или регулярного выражения:
$("#sel1").change(function() {
$("#sel2").prop("disabled", false); //enable the second select
$("#sel2").change(); //trigger a change event on select2
});
$("#sel2").change(function() {
//Gather your select values
var sel1Value = $("#sel1").val();
var sel2Value = this.value;
//Concatenate a selector and show it!
$("div").hide(); //hide previously shown divs
$("#value-" + sel1Value + "-" + sel2Value).show();
});
Скрипт: http://jsfiddle.net/b7Q8s/18/
#sel1
во второй раз после изменения #sel2
.
Мое собственное предложение было бы:
/* a more precise selector would be useful, whether by specifying an ancestor or
by adding an id to the select elements. Binding the change event-handler: */
$('select').change(function(){
/* creating the id of the relevant element to show using map(),
to the string 'value-' plus whatever the map(), and get(), methods return: */
$('#value-' + $('select option:selected').map(function(){
// removing all non-numeric characters, returning the numbers:
return this.value.replace(/\D+/g,'');
/* forming an array with get(),
joining the array elements together with hyphens, with join(),
showing the element whose id matches the created string
selecting siblings, removing the select elements from that selection,
and hiding them: */
}).get().join('-')).show().siblings().not('select').hide();
/* triggering the change event so the above always only shows/hides
the relevant elements on loading the DOM: */
}).change();
Это не переключает отображение второго элемента выбора по дизайну, поскольку я, честно говоря, не вижу необходимости, поскольку первый select
всегда будет иметь выбранный, выбранный option
(даже если только по умолчанию) и будет, в противном случае, требуется невыбранный вариант будет выбрано, чтобы начать выберите change
событие (даже если вы хотите, чтобы выбрать option
, который уже выбран).
Рекомендации:
Пытаться
var $divs = $('div[id^="value-"]').hide();
var $sel1 = $('#sel1').one('change', function(){
$sel2.prop('disabled', false);
});
var $sel2 = $('#sel2');
$sel1.add($sel2).change(function(){
var p1 = $sel1.val().replace(/\D+/, '');
var p2 = $sel2.val().replace(/\D+/, '');
$divs.hide();
$('#value-' + p1 + '-' + p2).show();
})
Демо: скрипка