【问题标题】:Using jQuery and two selects, select2 shows disabled options with a lower value than select1?使用 jQuery 和两个选择,select2 显示的禁用选项的值低于 select1?
【发布时间】:2015-10-30 10:48:25
【问题描述】:

我一直在玩 jQuery 和两个选择框小于第一个框中选择的内容。

这里是 HTML:

<select class="select1">
  <option value="100">100</option>
  <option value="200">200</option>
</select>

<select class="select2">
  <option value="0">0</option>
  <option value="100">100</option>
  <option value="200">200</option>
  <option value="300">300</option>
</select>

这里是 jQuery:

var select1 = $(".select1");
var select2 = $(".select2");

select1
.change(function () {

  var select1Value = parseInt($(this).val(),10);

  select2.children().filter(function () {
    return $(this).attr("value") > select1Value;
  }).each(function () {
    $(this).attr('disabled', 'disabled')
  });

})
.change();

Here is a fiddle.

这里发生的情况是,在初始化时,.select2 中值为 200 和 300 的选项被禁用。当我将 select1 更改为 200 时,我期望发生的是 select2 中值为 300 的选项被禁用,但应该启用以前禁用但现在有效的选项,但情况并非如此初始化时发生的事情并没有真正改变。

如果有人能指出我在这个逻辑上哪里出了问题,那将不胜感激,在此先感谢!

【问题讨论】:

    标签: jquery select onchange options


    【解决方案1】:

    已经禁用的值必须在每次更改 select1 值时删除“禁用”属性。 因此,首先在 select1 的值发生变化时,我们删除 select2 中所有选项的禁用状态,然后检查值是更大还是更低。

    代码如下:

    var select1 = $(".select1");
    var select2 = $(".select2");
    
    select1
    .change(function () {
    
      var select1Value = parseInt($(this).val(),10);
    
      select2.children().each(function () {
        $(this).prop('disabled', false);
      });
    
      select2.children().filter(function () {
        return $(this).attr("value") > select1Value;
      }).each(function () {
        $(this).prop('disabled', true);
      });
    
    }).change();
    

    【讨论】:

    • 我不可能意识到这一点,因为我只是关注文档api.jquery.com/change...非常感谢!
    • 很高兴能得到任何帮助:)
    • 但是如果你去掉 .change() 调用,select2 必须被禁用的项目,在初始化时不会被禁用!
    • @Vishesh 你已经被大量的反对票拯救了,因为这是一个安静的一天。您不能在 SO 上复制和粘贴其他人的答案:P 我已对其进行了修改以反映 prop() 的使用,从而使其成为正确答案,请接受编辑。
    • 嘿,是的,我正要发表评论。在进行了一些更改后,我意识到我最终还是写了你。如果你愿意,我可以删除我的答案,因为你首先想出了它。 PS:我没有复制。
    【解决方案2】:
    var select1 = $(".select1");
    var select2 = $(".select2");
    
    select1
    .change(function () {
      select2.children().each(function () {
        $(this).removeAttr('disabled')
      });
      var select1Value = parseInt($(this).val(),10);
      select2.children().filter(function () {
        return $(this).attr("value") > select1Value;
      }).each(function () {
        $(this).attr('disabled', 'disabled')
      });
    
      })
    .change();
    

    【讨论】:

    • 请注意,jQuery 提倡使用 prop() 而不是 attr(),因为 disabled 是属性而不是属性?不过,感谢您提供额外的视角!
    • 很高兴,感谢您提供对此的正确见解;)
    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多