How can i load panel by id?

拥有回忆 提交于 2020-05-17 06:15:49

问题


I have two panel rpspanel and sppanel Panel how can i show or hide them based on the selected list ID?

I have this list:

 <ul id="list" style="line-height: 0.01;">
      @foreach (var item in compInfo)
             {
              <li data-expanded="false" class="panel-handler" data-id="@item.ID">@item.CompanyName
                 @foreach (var scontractor in item.SubContractor)
                    {
                      <ul>
                         <li class="panel-handler" data-expanded="true" data-id="@subcontractor.ID">@scontractor.Name</li>
                       </ul>
                     }                                    
               </li>
            }
  </ul>

On <li> list click i want to hide or show, if the nested clicked i want clicked show sppanel if the parent list clicked i want to show rpspanel


I'm able to hides and show rpspanel when the parent <li> clicked, I used this JQuery but i cant handle the nested list
<script>
    $(document).ready(function () {
        $(".panel-handler").click(function () {
            showInfo($(this).data("id"));
        });

        function showInfo(id) {
            $(".rpspanel").slideUp();
            $("#" + id).slideDown();
        }

        // For first time load
        showInfo($(".panel-handler").eq(0).data("id"))
</script>

My First Panel:

  @foreach (var item in compInfo)
            {
          <div class="panel rpspanel panel-default" id="@item.ID">
                        <div class="panel-heading">
                           <h5>Contact Information<h5>
                        </div>
                        <div class="panel-body">                      
                            <div class="card card-default">
                                <div class="card-heading">
                                    <h4>Contact Details</h4>
                                </div>
                                <div class="card-body">
                                    <p>
                                        @item.Name<br>
                                        @item.Phone<br>
                                        @item.Email<br>                                          
                                    </p>
                                </div>
                            </div>
              </div>
    </div>
    }

My Second Panel

@foreach (var scontractor in item.Contractors)
{
    <div class="panel sppanel panel-default" id="@scontractor.ID">
        <div class="panel-heading">
           <h5>Contact Information<h5>
        </div>
        <div class="panel-body">                      
            <div class="card card-default">
                <div class="card-heading">
                    <h4>Contact Details</h4>
                </div>
                <div class="card-body">
                    <p>
                        @scontractor.Name<br>
                        @scontractor.Phone<br>
                        @scontractor.Email<br>
                    </p>
                </div>
            </div>
        </div>
    </div>

回答1:


$(document).ready(function () {
    $(".panel-handler").click(function (event) {
        $(".rpspanel,.sppanel").slideUp();
        var $this = $(this);
        // Show li clicked
        showInfo($this.data("id"));

        if ($this.hasClass('company')) {
           // If company then show all contractors under that company
           $this.find('.contractor').each( function(index, el) {
              showInfo($(el).data("id"));
           });
        } else if ($this.hasClass('contractor')) {
           // If contractor then show company for that contractor
           showInfo($this.closest('.company').data("id"));
        }

        return false;
    });

    function showInfo(id) {
        $("#" + id).slideDown();
    }

    // For first time load
    $(".panel-handler:first").click();
});
.panel-handler {
  cursor: pointer;
}
<!DOCTYPE html>

<head>
  <link rel="stylesheet" href="./placeholder.css">
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    .panel-handler {
      cursor: pointer;
    }
  </style>
</head>

<body>

<ul id="list"> <!-- style="line-height: 0.01;"> -->
  <li data-expanded="false" class="panel-handler company" data-id="company1">Company 1
      <ul><li class="panel-handler contractor" data-expanded="true" data-id="subcontractor1a">Contractor 1A</li></ul>
      <ul><li class="panel-handler contractor" data-expanded="true" data-id="subcontractor1b">Contractor 1B</li></ul>
  </li>

  <li data-expanded="false" class="panel-handler company" data-id="company2">Company 2
      <ul><li class="panel-handler contractor" data-expanded="true" data-id="subcontractor2a">Contractor 2A</li></ul>
      <ul><li class="panel-handler contractor" data-expanded="true" data-id="subcontractor2b">Contractor 2B</li></ul>
  </li>
</ul>


<div class="panel rpspanel panel-default" id="company1">
   <div class="panel-body">
       <div class="card card-default">
           <div class="card-heading">
               <h4>Company Details</h4>
           </div>
           <div class="card-body">
               <p>
                   Company 1<br>
                   555-555-1111<br>
                   company1@fake.com<br>
               </p>
           </div>
       </div>
     </div>
</div>


    <div class="panel sppanel panel-default" id="subcontractor1a">
        <div class="panel-body">
            <div class="card card-default">
                <div class="card-heading">
                    <h4>Contractor Details</h4>
                </div>
                <div class="card-body">
                    <p>
                        Contractor 1A<br>
                        Contractor 555-1111A<br>
                        contractor1a@fake.com<br>
                    </p>
                </div>
            </div>
        </div>
    </div>

    <div class="panel sppanel panel-default" id="subcontractor1b">
        <div class="panel-body">
            <div class="card card-default">
                <div class="card-heading">
                    <h4>Contractor Details</h4>
                </div>
                <div class="card-body">
                    <p>
                        Contractor 1B<br>
                        Contractor 555-1111B<br>
                        contractor1b@fake.com<br>
                    </p>
                </div>
            </div>
        </div>
    </div>

<div class="panel rpspanel panel-default" id="company2">
   <div class="panel-body">
       <div class="card card-default">
           <div class="card-heading">
               <h4>Company Details</h4>
           </div>
           <div class="card-body">
               <p>
                   Company 2<br>
                   555-555-2222<br>
                   company2@fake.com<br>
               </p>
           </div>
       </div>
     </div>
</div>

    <div class="panel sppanel panel-default" id="subcontractor2a">
        <div class="panel-body">
            <div class="card card-default">
                <div class="card-heading">
                    <h4>Contractor Details</h4>
                </div>
                <div class="card-body">
                    <p>
                        Contractor 2A<br>
                        Contractor 555-2222A<br>
                        contractor2a@fake.com<br>
                    </p>
                </div>
            </div>
        </div>
    </div>

    <div class="panel sppanel panel-default" id="subcontractor2b">
        <div class="panel-body">
            <div class="card card-default">
                <div class="card-heading">
                    <h4>Contractor Details</h4>
                </div>
                <div class="card-body">
                    <p>
                        Contractor 2B<br>
                        Contractor 555-2222B<br>
                        contractor2b@fake.com<br>
                    </p>
                </div>
            </div>
        </div>
    </div>


</body>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="./loadpanel.js"></script>

jQuery bubbles up events to the parent elements, which results in a click on the nested li to call $(".panel-handler").click() for the nested li and then bubble up to call it for the parent li. This bubbling makes it appear as if the click on the nested li isn't occurring.

To prevent the bubbling return false from the click handler. Read up on bubbling events and returning false versus calling event.preventDefault(), event.stopPropagation(), and event.stopImmediatePropagation().

I would first differentiate the Company li's from the Contractor li's by adding the appropriate classes.

<ul id="list" style="line-height: 0.01;">
@foreach (var item in compInfo)
 {
  <li data-expanded="false" class="panel-handler company" data-id="@item.ID">@item.CompanyName
     @foreach (var scontractor in item.SubContractor)
        {
          <ul>
             <li class="panel-handler contractor" data-expanded="true" data-id="@subcontractor.ID">@scontractor.Name</li>
           </ul>
         }
   </li>
}

Then the code to manage the panels becomes clearer.

$(document).ready(function () {
$(".panel-handler").click(function (event) {
    $(".rpspanel,.sppanel").slideUp();
    var $this = $(this);
    // Show li clicked
    showInfo($this.data("id"));

    if ($this.hasClass('company')) {
       // If company then show all contractors under that company
       $this.find('.contractor').each( function(index, el) {
          showInfo($(el).data("id"));
       });
    } else if ($this.hasClass('contractor')) {
       // If contractor then show company for that contractor
       showInfo($this.closest('.company').data("id"));
    }

    return false;
});

function showInfo(id) {
    $("#" + id).slideDown();
}

// For first time load
$(".panel-handler:first").click();

});



来源:https://stackoverflow.com/questions/61512047/how-can-i-load-panel-by-id

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!