[英]How to change options based on another select option in a table?
Here is my HTML. 这是我的HTML。 I try to keep it as simple as possible.
我尽量保持简单。
<table>
<tbody>
<tr>
<td>
<select class="category">
<option value="low">Low</option>
<option value="mid">Mid</option>
<option value="high">High</option>
</select>
</td>
<td>
<select class="details">
<option value="1">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>
</select>
</td>
</tr>
<tr>
<td>
<select class="category">
<option value="low">Low</option>
<option value="mid">Mid</option>
<option value="high">High</option>
</select>
</td>
<td>
<select class="details">
<option value="1">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>
</select>
</td>
</tr>
</tbody>
</table>
How to show options(class="details") on the first row based on logic (low=1-2, mid=3-4, high=5-6) and select first option(class="details") without changing options(class="details") on the others row? 如何根据逻辑(低= 1-2,中= 3-4,高= 5-6)在第一行显示选项(class =“details”)并选择第一个选项(class =“details”)而不更改其他行上的选项(class =“details”)?
I have tried this 我试过这个
$('.category').on('change',function(){
switch ($(this).val()){
case 'low':
$('.details option').each(function(){
if (+$(this).val() < 3 ) {
$(this).show();
$(this).find('option:first').prop('selected', true);
} else $(this).hide();
});
break;
case 'mid':
$('.details option').each(function(){
if (+$(this).val() < 5 && +$(this).val() > 2) {
$(this).show();
$(this).find('option:first').prop('selected', true);
} else $(this).hide();
});
break;
case 'high':
$('.details option').each(function(){
if (+$(this).val() > 4 ) {
$(this).show();
$(this).find('option:first').prop('selected', true);
} else $(this).hide();
});
break;
case '':
$('.details option').show();
$('.details option:first').prop('selected', true);
break;
}
});
But every time I change others row category, it changes every option (class=" details") on the table. 但每次我更改其他行类别时,它都会更改表格中的每个选项(class =“details”)。
As you are using $('.details option')
so it will get all details options and loop for all. 当您使用
$('.details option')
,它将获取所有详细信息选项并循环播放。 So instead of using $('.details option')
use this $(this).closest('tr').find('.details option')
所以不使用
$('.details option')
而是使用$('.details option')
$(this).closest('tr').find('.details option')
The closest
will only return selected category
details options and loop only for that not for all. closest
只返回选定的category
详细信息选项,并且仅针对不是全部的选项循环。
DEMO DEMO
$('.category').on('change', function() { switch ($(this).val()) { case 'low': $(this).closest('tr').find('.details option').each(function() { if (+$(this).val() < 3) { $(this).show(); $(this).find('option:first').prop('selected', true); } else $(this).hide(); }); break; case 'mid': $(this).closest('tr').find('.details option').each(function() { if (+$(this).val() < 5 && +$(this).val() > 2) { $(this).show(); $(this).find('option:first').prop('selected', true); } else $(this).hide(); }); break; case 'high': $(this).closest('tr').find('.details option').each(function() { if (+$(this).val() > 4) { $(this).show(); $(this).find('option:first').prop('selected', true); } else $(this).hide(); }); break; case '': $(this).closest('tr').find('.details option').show(); $(this).closest('tr').find('.details option:first').prop('selected', true); break; } });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <table> <tbody> <tr> <td> <select class="category"> <option value="low">Low</option> <option value="mid">Mid</option> <option value="high">High</option> </select> </td> <td> <select class="details"> <option value="1">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> </select> </td> </tr> <tr> <td> <select class="category"> <option value="low">Low</option> <option value="mid">Mid</option> <option value="high">High</option> </select> </td> <td> <select class="details"> <option value="1">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> </select> </td> </tr> </tbody> </table>
I'm not sure I understand what you mean, but I think this is... 我不确定我明白你的意思,但我认为这是......
$('.category').on('change',function(){ var option = $(this).data('option'); var value = $(this).val(); var details = $('select.details[data-option="'+option+'"]'); switch( value ) { case 'low': details.html(` <option value="1">1</option> <option value="2">2</option> `); break; case 'mid': details.html(` <option value="3">3</option> <option value="4">4</option> `); break; case 'high': details.html(` <option value="5">5</option> <option value="6">6</option> `); break; } });
<table> <tbody> <tr> <td> <select class="category" data-option="1"> <option value="low">Low</option> <option value="mid">Mid</option> <option value="high">High</option> </select> </td> <td> <select class="details" data-option="1"> <option value="1">1</option> <option value="2">2</option> </select> </td> </tr> <tr> <td> <select class="category" data-option="2"> <option value="low">Low</option> <option value="mid">Mid</option> <option value="high">High</option> </select> </td> <td> <select class="details" data-option="2"> <option value="1">1</option> <option value="2">2</option> </select> </td> </tr> </tbody> </table>
I suggest the use of hide
class instead, what gives you the ability to select the first option simply like : 我建议使用
hide
class,这使你能够选择第一个选项,就像:
$('.category').on('change', function() { var detail = $(this).closest('tr').find('.details'); switch ($(this).val()) { case 'low': detail.find('option').each(function() { if (+$(this).val() < 3) { $(this).removeClass('hide'); } else { $(this).addClass('hide'); } }); break; case 'mid': detail.find('option').each(function() { if (+$(this).val() < 5 && +$(this).val() > 2) { $(this).removeClass('hide'); } else { $(this).addClass('hide'); } }); break; case 'high': detail.find('option').each(function() { if (+$(this).val() > 4) { $(this).removeClass('hide'); } else { $(this).addClass('hide'); } }); break; case '': detail.find('option').show(); detail.find('option:first').prop('selected', true); break; } detail.find('option:not(.hide):first').prop('selected', true); });
.hide { display: none; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <table> <tbody> <tr> <td> <select class="category"> <option value="low">Low</option> <option value="mid">Mid</option> <option value="high">High</option> </select> </td> <td> <select class="details"> <option value="1">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> </select> </td> </tr> <tr> <td> <select class="category"> <option value="low">Low</option> <option value="mid">Mid</option> <option value="high">High</option> </select> </td> <td> <select class="details"> <option value="1">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> </select> </td> </tr> </tbody> </table>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.