jquery 当相关复选框未选中时,试图隐藏不相关的div

xam8gpfp  于 2023-08-04  发布在  jQuery
关注(0)|答案(1)|浏览(75)

我有以下代码,其中有两个要求。
1.用户应能够选中一个复选框。如果他们选中第二个复选框,它应该取消选中第一个复选框。这对我来说是基于下面代码中显示的JS解决方案。
1.只显示与复选框相关的div,隐藏其他div。这样不行

**注意:**由于某些原因,select2()在我下面包含的代码段中不起作用,因此它不会显示选中复选框后显示的所有div。因此,我包括一个JSFiddle link here,它工作正常,并显示了我所指的内容。因此,请参考JSFiddle链接,以了解我的问题的全貌。

为了解决上面的第2点,我想知道我是否需要切换到CSS类来更好地处理显示div和隐藏div,而不是通过jQuery .show().hide()方法来处理它?

//code to select only one checkbox
let boxes = document.querySelectorAll("input[type=checkbox]");
boxes.forEach(b => b.addEventListener("change", tick));
function tick(e) {
  let state = e.target.checked; // save state of changed checkbox
  boxes.forEach(b => b.checked = false); // clear all checkboxes
  e.target.checked = state; // restore state of changed checkbox
}

//Initialize select2
$("#availableLocations").select2();
$("#newLocation").select2();
$("#destinationLocation").select2();
$("#availableLocations").hide();
$("#forNewLocation").hide();
$("#retireLocationChange").hide();
$("#updateLocationChange").hide();
$("#markAsFullChange").hide();
$("#moveContentsChange").hide();

$("[name='changeLocation']").click(function() {
    if ($(this).is(":checked")) {
        $("#forNewLocation").show();
        $("#availableLocations").show();


    } else {
        $("#forNewLocation").hide();
        $("#availableLocations").hide();
    }
});

$("[name='retireLocation']").click(function() {

    if ($(this).is(":checked")) {
        $("#retireLocationChange").show();
        $("#availableRetireLocations").show();
        $("#availableRetireLocations").select2();
    } else {
        $("#retireLocationChange").hide();
        $("#availableRetireLocations").hide();
    }
});

$("[name='updateLocation']").click(function() {

    if ($(this).is(":checked")) {
        $("#updateLocationChange").show();
        $("#availableUpdateLocations").show();
        $("#availableUpdateLocations").select2();

        //Check if user selects something from the dropdown
        $("#availableUpdateLocations").change(function() {

            let locationVal = $(this).val();


        });

    } else {
        $("#updateLocationChange").hide();
        $("#availableUpdateLocations").hide();
    }
});

//mark as full
$("[name='markAsFull']").click(function() {

    if ($(this).is(":checked")) {
        $("#markAsFullChange").show();
        $("#availableMarkAsFullLocations").show();
        $("#availableMarkAsFullLocations").select2();
    } else {
        $("#markAsFullChange").hide();
        $("#availableMarkAsFullLocations").hide();
    }
});


$("#newLocation").change(function() {

    let selectedVal = $(this).val();
    $("#destinationLocation").empty();


});


/*FOR MOVE CONTENTS  */
$("[name='moveContents']").click(function() {

    console.log("Inside Move Contents");
    if ($(this).is(":checked")) {
        $("#moveContentsChange").show();
        $("#tierOneCheckBoxContents").hide();
        $("#tierTwoCheckBoxContents").hide();
        //For Tier One Selection
        $("[name='tierOneMove']").click(function() {

            if ($(this).is(":checked")) {
                console.log("Tier-I move selected");
                $("#tierOneCheckBoxContents").show();
                $("#availableTopLevelLocations").select2();
                $("#contentsInsidetopLevellocation").select2();
                $("#availableDestinationTopLevelLocations").select2();

                $("#contentsInsidetopLevellocation").empty();

                //User selects from the top level drop down ist
                $("#availableTopLevelLocations").change(function() {
                    let locationVal = $(this).val();
                    console.log(locationVal);
                    $("#contentsInsidetopLevellocation").empty();

                });

            } else {
                $("#tierOneCheckBoxContents").hide();
            }
        });


    } else {
        $("#moveContentsChange").hide();
    }
    //End: Tier One Block

    //Tier II move begins
    $("[name='tierTwoMove']").click(function() {

        if ($(this).is(":checked")) {
            console.log("Tier-II move selected");
            $("#tierTwoCheckBoxContents").show();

            $("#availableTopLevelLocationsforTierTwo").select2();
            $("#contentsInsidetopLevellocationfortiertwo").select2();
            $("#contentsInsidetopLevellocationfortiertwo").empty();
            //For multiselect 
            $("#tierThreeId").select2();
            //$('.multiple-select').multipleSelect()
            $("#availableDestinationLocationsforTierTwo").select2();
            //Empty Tier Two location
            $("#contentsInsidetopLevellocationfortiertwo").empty();
            //Empty Tier III location
            $("#tierThreeId").empty();

            //Tier-I location is selected
            $("#availableTopLevelLocationsforTierTwo").change(function() {
                let locationVal = $(this).val();
                console.log(locationVal);

                $("#contentsInsidetopLevellocationfortiertwo").empty();
                $("#tierThreeId").empty();

            });

            //Tier-II location is selected
            $("#contentsInsidetopLevellocationfortiertwo").change(function() {
                //When Tier II option is selected, popuate Tier III with its contents
                let locationVal = $(this).val();
                console.log(locationVal);

            });

            //Tier-III location is selected

        } else {
            $("#tierTwoCheckBoxContents").hide();
        }
    });



});

个字符

20jt8wwn

20jt8wwn1#

你把事情弄得太复杂了。只需使用单选按钮而不是复选框,因为它们的设计默认情况下只有一个选中。
如果你把第二层选项放在每个单选按钮附近,那么你就可以显示/隐藏最接近的元素,而不需要跟踪ID和状态。这样做,你甚至不需要把ID放在任何元素上。
这是一个非常简化的例子,并不包含你最初问题中的所有选项,但它只是为了给予如何简化这个问题的想法。

$(".tier1-options :radio").on("change", function (e) {
  //remove shown class from all tier2 options and clear values from all form elements inside it
  $('.tier2-options')
    .removeClass('shown')
    .find('input, select').val('')
  
  //show the related tier2 options
  $(this)
    .parents('.tier1-options')
    .find('.tier2-options')
    .addClass('shown')
});
.tier2-options {
  display: none;
  margin-left: 1rem;
  padding: 1rem;
  background-color: #EEE;
}

.shown{
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<h5>Select one of the checkboxes:</h5>

<div class='tier1-options'>
  <label>
    <input name="useroption" type="radio" value="changeLocation">
    Change Location
  </label>

  <div class="tier2-options">
    <select name="availableMarkAsFullLocations">
      <option value="-">--Please Select--</option>
      <option value="3">BOX#3</option>
      <option value="6">FREEZER#1</option>
      <option value="8">FREEZER#2</option>
      <option value="19">BOX#9</option>
      <option value="20">QBUILDING</option>
    </select>
  </div>
</div>

<div class="tier1-options">
  <label>
    <input name="useroption" type="radio" value="updateLocation">
    Update Location
  </label>

  <div class="tier2-options">
    <select name="availableUpdateLocations">
      <option value="-">--Please Select--</option>
      <option value="3">BOX#3</option>
      <option value="6">FREEZER#1</option>
      <option value="8">FREEZER#2</option>
      <option value="19">BOX#9</option>
    </select>
  </div>
</div>

<div class="tier1-options">
  <label>
    <input name="useroption" type="radio" value="retireLocation">
    Retire
  </label>

  <div class="tier2-options">
    <select name="availableRetireLocations">
       <option value="-">--Please Select--</option>
       <option value="3">BOX#3</option>
       <option value="6">FREEZER#1</option>
       <option value="8">FREEZER#2</option>
       <option value="19">BOX#9</option>
       <option value="20">QBUILDING</option>
    </select>
  </div>
</div>

相关问题