Jquery - 如果满足条件则禁用字段

Posted

技术标签:

【中文标题】Jquery - 如果满足条件则禁用字段【英文标题】:Jquery - Disable field if criteria is met 【发布时间】:2016-06-13 14:22:33 【问题描述】:

我有一个有 15 行的表单。每行都有一个编号为 1 - 15 (row_id) 的 ID,每行包含一个选择字段和多个文本字段。

我想要做的是,如果 row_id 6 或以上的 select 选项设置为 0 以外的任何值,则禁用 row_id 5,如果 row_id 11 或以上的 select 选项设置为 0 以外的任何值,则禁用row_id 10。

例如:

Any select > 0 on rows 6 - 15 will disable row 5
AND 
Any select > 0 on rows 11 -15 will disable row 10

所以在第 12 行选择 2 会禁用第 5 行和第 10 行

我创建了一个小提琴来显示表格以及如何设置 row_ids,但我现在知道如何做到这一点.. http://jsfiddle.net/v0kvwfje/2/

有什么建议吗?


编辑:小提琴代码:

 $("select").change(function() 
      id = $(this).attr("row_id");
      val = $(this).val();
 );

【问题讨论】:

到目前为止您尝试过什么?展示你的测试以及目前没有工作的地方 【参考方案1】:

你可以这样做:

 $("select").change(function() 
      var disabled = false;
      var selects = $("select");
      for (var i=selects.length - 1; i >= 4; i--) 
          if (i % 5 == 4) $(selects[i]).prop("disabled", disabled);
          disabled |= selects[i].value;
      
 );

Fiddle.

此代码将从下到上遍历SELECT 元素。每当它发现一个非零条目时,它会将 disabled 变量设置为true;在循环的其余部分中,它永远无法再次获得false

一旦遇到特殊的第 10 行和第 5 行(从零开始编号的 4 和 9),该 disabled 值将用于设置相应元素的disabled 属性。

如果您决定将列表扩展为多 5 行,并希望应用相同的原则来启用/禁用第 15 个SELECT 元素,则无需更改上述代码。无论列表有多长,它都会为每五个 SELECT 元素完成这项工作。

【讨论】:

谢谢这很好用。你能解释一下for (var i=selects.length - 1; i >= 4; i--) if (i % 5 == 4) $(selects[i]).prop("disabled", disabled); 如果我想让它适用于 10/20 条目、9/18 或 6/12 等,我需要做什么? 该代码的关键部分是i % 5 == 4。这意味着:i 除以 5 余数为 4。如果你想将它应用到 10/20 条目,你可以写 i % 10 == 9。对于 9/18,您可以写 i % 9 == 8。最后一个示例的另一种方法是(i+1)%9==0。那可能是更好的代码,因为这样您只需要更改 9。0 始终保持不变。 @JeffVader,这回答了你的问题吗? 谢谢,很有帮助。 快速跟进。如果设置了 9 或 18,我如何为 27 个条目执行此操作?我可以改变选择的背景颜色吗?我花了很多时间尝试这个,但无法让它工作..谢谢【参考方案2】:

第 6 - 15 行的任何选择 > 0 都会禁用第 5 行

使用您已经设置的变量将其转换为代码:

任何=if 选择 > 0 = val > 0 第 6-15 行 = id >= 6(因为有 15 行,无需明确检查) 禁用第 5 行 $("[row_id=5]").attr("disabled", true)

即:

if (val>0 && id>=6) $("[row_id=5]").attr("disabled", true)
if (val>0 && id>=11) $("[row_id=10]").attr("disabled", true)

如果您想要例如 6-10 而不是 6-end,则添加:(val>0 and id>=6 && id<=10)

或者更通用的情况是在选择之前禁用所有内容:

  for(var i=1;i<id;++i)
      $("[row_id='" + i + "']").attr("disabled", true);

【讨论】:

【参考方案3】:

试试这个代码

 $("select").change(function() 

  //new code starts here
  var section1 = false;
  var section2 = false;
  var indx = 0;
  $("table tr").each(function()
         if(indx>=6 && indx<15)
            if($(this).find('select').val()==0)    
        section1=true;
      
   
   if(indx>=11 && indx<15)
            if($(this).find('select').val()==0)
        section2=true;
      
   

  if(section1==true)
    $("table tr").eq(5).find("select").attr('disabled','disabled');
  else
    $("table tr").eq(5).find("select").removeAttr('disabled');
  
  if(section2==true)
    $("table tr").eq(10).find("select").attr('disabled','disabled');
  else
    $("table tr").eq(10).find("select").removeAttr('disabled');
  
  indx++;
 );
 //new code ends here

  id = $(this).attr("row_id");
  val = $(this).val();
  alert("ID:" + id + " Value:" +val);

 );

fiddle link

【讨论】:

您应该使用比依赖.eq(5) 更好的选择器,因为这会阻止您调整布局。例如,当有人指出您不应该使用这样的表(OP 代码)并且您更改它时,代码就会停止工作 - 它不应该停止工作。 是的,你是对的,但我认为根据他提供的信息,这是最好的解决方案,可能有很多最好的解决方案,但对于表格布局等其他事情可能会更改或分配 ID /classes 到目标元素等。【参考方案4】:

用这个替换你现有的 javascript/JQuery 代码:

$("select").change(function() 
    var fifthFlag = 0,
        tenthFlag = 0,
        fifthSelectElement = "select[row_id='5']",
        tenthSelectElement = "select[row_id='10']";

    $("select").each(function()
        var id = $(this).attr("row_id"),
            val = $(this).val();

        if(val > 0)
            if(id >= 6 && id <= 10) fifthFlag = 1; 
            else if(id >= 11)tenthFlag = 1;
         
    );

    if(tenthFlag == 1 && fifthFlag == 1)
        $(fifthSelectElement).attr("disabled","disabled");
        $(tenthSelectElement).attr("disabled","disabled");
     else if(tenthFlag == 1 && fifthFlag == 0) 
        $(fifthSelectElement).attr("disabled","disabled");
        $(tenthSelectElement).attr("disabled","disabled");
     else if (tenthFlag == 0 && fifthFlag == 1)
        $(fifthSelectElement).attr("disabled","disabled");
        $(tenthSelectElement).removeAttr("disabled");
     else 
        $(fifthSelectElement).removeAttr("disabled");
        $(tenthSelectElement).removeAttr("disabled");
    
);

【讨论】:

这有效,但当其他行之一设置回 0 时,不会重新启用第 5 行或第 10 行。 为了满足您的要求,我已经更新了我的代码。请尝试使用这个新代码。希望这能帮助您满足您的要求。

以上是关于Jquery - 如果满足条件则禁用字段的主要内容,如果未能解决你的问题,请参考以下文章

JsonPath:如果满足条件,则选择根级别字段

如果条件满足,则更新表。 (将表b中的值更新为a)所需的相应值[重复]

如果条件满足要求,JS启用禁用按钮

循环

使用jquery禁用具有名称属性的textarea字段[重复]

MySQL存储过程——一一检查是不是满足某些条件;如果不满足,则退出程序并返回特定消息