【问题标题】:Find nearest div with class disableDiv and disable all of its contents使用类 disableDiv 查找最近的 div 并禁用其所有内容
【发布时间】:2017-02-22 23:01:01
【问题描述】:

在这段代码中,我正在检查带有类 disableDivCheckbox 的复选框,并且该代码正在禁用所有带有类 disableDiv 的 div 内容。但是,如果我将此组合应用于另一个复选框和另一个 div,则无法正常工作。所以我想找到最接近的 div 类 disableDiv 并只禁用那个 div。我正在使用 disbale * 因为我想禁用 div 及其内容。

$(".disableDivCheckbox").click(function () {
            if ($(this).is(":checked")) {
               $('.disableDiv *').removeAttr("disabled");
            }
            else {
                $('.disableDiv *').val('').prop('checked', false).attr("disabled", "disabled");
            }
        });

小提琴:https://jsfiddle.net/8c0x1pho/

【问题讨论】:

  • 显示 HTML。 disableDivCheckboxdisableDiv 的孩子吗?
  • 2 个选项:.closest(...).parents('commonParent').find(...)。使用哪一个将取决于您的标记

标签: javascript jquery


【解决方案1】:

你可以试试这个方法:

  • 获取检查状态并将其保存在变量中
  • 使用this 导航到所有必要的元素。这将使您的代码更加模块化。
  • 尽量不要使用* 选择器。使用更具体的选择器,因为这将指定您正在操作的元素类型并使您的代码更具可重用性。
  • 您可以将disabled 的值设置为truefalse,而不是attrremoveAttr。你可以使用!$(..).is(":checked")

示例:

// Only call functions. DON'T declare any functions in ready.
$(document).ready(function() {
  // Have a common function. 
  // If size grows, this can be exported to its own file
  registerEvents();
  
  // Initialise on load states.
  updateUIStates("#addBusinessObjectivesCheckbox")
});

function registerEvents() {
  $(".disableDivCheckbox").click(function() {
    updateUIStates(this)
  })
}

function updateUIStates(el) {
  var isNotChecked = !$(el).is(":checked");
  var inputs = $(el)
    .parents(".checkbox")
    .siblings(".disableDiv")
    .find('input');
  inputs.attr("disabled", isNotChecked)
  isNotChecked && inputs.val('').prop('checked', false)
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<fieldset id="AddBusinessObjectivesFieldset" class="">
  <legend>
    Add business objectives
  </legend>
  <div class="checkbox">
    <label>
      <input type="checkbox" value="addBusinessObjectivesCheckbox" name="addBusinessObjectivesCheckbox" class="disableDivCheckbox" id="addBusinessObjectivesCheckbox"> Add business objectives
    </label>
  </div>
  <div style="border: 2px solid;margin-bottom: 5px;border-color: gray;padding: 0px 0px 0px 5px;margin-top: 5px;margin-right: 10px;" class="disableDiv">
    <div class="form-inline" style="margin-top:5px;margin-bottom:5px;">
      <table>
        <tr>
          <td>
            <div class="radio">
              <label>
                <input type="radio" name="AddBusinessObjectives" id="" value="0" class=""> Fixed N
              </label>
            </div>
          </td>
          <td>
            <div class="radio">
              <label>
                <input type="radio" name="AddBusinessObjectives" id="" value="1" class=""> Random upto N
              </label>
              <input type="text" placeholder="Enter N" id="indexTextboxAddBusinessObjectives" name="indexTextboxAddBusinessObjectives" style="width:70px" class="" />
            </div>
          </td>
        </tr>
      </table>
    </div>
  </div>
</fieldset>

指针

  • $(document).ready() 更像是init 函数。尝试调用函数而不是在其中定义。这将更容易理解,因为它会描述一个流程。
  • 使用纯函数然后调用。像onChange,你可以调用几个函数:updateUIStates()postDataToServer()processResponse()otherTodos()。这可能看起来有点矫枉过正,但从长远来看,这会有所帮助。
  • 在您的标记中创建一个树形结构。
<div class="container">
  <div class="checkbox-container">...</div>
  <div class="input-containers">...</div>
</div>

这将简化导航部分。无论您使用什么结构,都要保持标准化。这将使您的 JS 保持干净。

【讨论】:

    【解决方案2】:

    试试这个,

    $(".disableDivCheckbox").click(function () {
        if ($(this).is(":checked")) {
            $(this).closest('.disableDiv *').removeAttr("disabled");
        } else {
            $(this).closest('.disableDiv *').val('').prop('checked', false).attr("disabled", "disabled");
        }
    });
    

    这意味着,您将仅禁用 disableDivCheckbox 所属的 disableDiv 类的所有内容。

    试一试,会成功的。

    【讨论】:

    • 在了解 HTML 结构之前,我不会提出任何建议。用一半的知识回答可能对你不利。
    • 我相信,如果需求明确,无论html、css、js什么的,还是可以回答的。
    • @Rajesh 给出了明智的建议,听听他的意见,以上代码的任何方式都行不通。我把它留给你识别
    • 好的,谢谢伙计!从下次@Rajesh 开始,我会保留这个给我
    • @ParagBandewar 我已回滚您的编辑。请运行您的代码,然后粘贴链接。您在小提琴中缺少 jQuery。人们会检查小提琴的工作演示,当事情不工作时,他们会假设它的用户代码并会否决它。
    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2015-12-02
    • 2017-10-30
    相关资源
    最近更新 更多