Search code examples
javascriptjqueryhideshowhidden

Javascript hide/show div


I have a javascript hide/show div with 4 different divs going. It is working partially but not performing the way I would like. When I click one of the divs it opens up the hidden div, which is perfect, but when I click the other link to open up the other div I want the other one I clicked first to close and then the new one to open. Here is my javascript.

$('[id^="hideshow"]').on('click', function(event) {
    var dataValue = $(this).attr('data-value');
    dataValue = $('#'+dataValue);
    $(dataValue).toggle('hide');
});

<a class="pure-button pure-button-primary" type='button' id='hideshow1' value='hide/show' data-value="content1"><div class="witb">
    <hr class="dark2">
  <p></p>Whats in the Bag &nbsp;<i class="fa fa-angle-down" style="font-size:24px"></i></p>
  </div>
</div></a>

    <div id='content2' style="display:none">
<div class="wedge-thumbs">
  <img class="thumbs" src="build/wedge-thumb.png?$staticlink$" alt="Milled Grind Header">
  <a href="#" class="customize"><span style="customize"> Customize It</span></a>
  <hr class="dark">
  <span class="title">Milled Grind 54&deg; LB</span>

</div>
<div class="wedge-thumbs">
  <img class="thumbs" src="build/wedge-thumb.png?$staticlink$" alt="Milled Grind Header">
  <a href="#" class="customize"><span style="customize"> Customize It</span></a>
  <hr class="dark">
  <span class="title">Milled Grind 54&deg; LB</span>

</div>

<div class="wedge-thumbs">
  <img class="thumbs" src="build/wedge-thumb.png?$staticlink$" alt="Milled Grind Header">
  <a href="#" class="customize"><span style="customize"> Customize It</span></a>
  <hr class="dark">
  <span class="title">Milled Grind 54&deg; LB</span>

</div>

</div>

Solution

  • // Hopefully you have some selector reference to target them all
    var $all = $(".drops");  // Clearly I used .drops for example
    
    $('[data-value]').on('click', function(event) {
    
        var $target = $('#'+ this.dataset.value);
    
        $all.not( $target ).hide(); // Hide all but target one
        $target.toggle();           // Toggle target one
    });
    

    Here's an improved example:

    var $all = $(".togglable");
    
    $('[data-toggle]').on('click', function(event) {
    
      var $target = $(this.dataset.toggle);
    
      $all.not( $target ).hide(); // Hide all but target one
      $target.toggle();           // Toggle target one
    });
    [data-toggle]{cursor:pointer; display:inline-block; color:#0bf; padding:0 8px;}
    .hidden{display: none;}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <a data-toggle="#el1">TOGGLE1</a>
    <a data-toggle="#el2">TOGGLE2</a>
    <a data-toggle="#el3">TOGGLE3</a>
    
    <div id="el1" class="togglable hidden">ELEMENT1</div>
    <div id="el2" class="togglable hidden">ELEMENT2</div>
    <div id="el3" class="togglable hidden">ELEMENT3</div>