简体   繁体   English

如何根据表中的其他选择选项更改选项?

[英]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> 

What you can do is select only the options in the same row by using the jQuery closest function 您可以做的是使用jQuery 最近函数仅选择同一行中的选项

Change the code $('.details option') to $(this).closest('tr').find('.details option') 将代码$('.details option')更改$(this).closest('tr').find('.details option')

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> 

Working fiddle 工作小提琴

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM