Dale Doback
Dale Doback

Reputation: 97

jQuery show and hide dynamic classes not working

I am trying to hide and show div's displayed on my page with a select element however having a bit of trouble as I can't seem to get the jQuery to function.

I am listing results from my SQL table using PHP that currently displays every row onto my page and prints them into a list.

I want to make the jQuery hide the div's that don't have a class that matches the select option that is selected.

Here is an example of the listing template that echo's out all of the MySQL results and displays them into a template and is then looped to display every row on the table:

<?php while($row = $results->fetch(PDO::FETCH_ASSOC))
      {
      echo '
        <div class="listing-container ' . $row["Make"] . '">
          <a href="carpage.php"><h3 class="model-listing-title clearfix">'.$row["Make"].' '.$row["Model"].' '.$row["Variant"].'</h3></a>
          <h3 class="price-listing">£'.number_format($row['Price']).'</h3>
        </div>
        <div class="listing-container-spec">
         <img src="'.(explode(',', $row["PictureRefs"])[0]).'" class="stock-img-finder"/>
          <div class="ul-listing-container">
            <ul class="overwrite-btstrp-ul">
              <li class="diesel-svg list-svg">'.$row["FuelType"].'</li>
              <li class="saloon-svg list-svg">'.$row["Bodytype"].'</li>
              <li class="gear-svg list-svg">'.$row["Transmission"].'</li>
              <li class="color-svg list-svg">'.$row["Colour"].'</li>
            </ul>
          </div>
          <ul class="overwrite-btstrp-ul other-specs-ul h4-style">
            <li>Mileage: '.number_format($row["Mileage"]).'</li>
            <li>Engine size: '.$row["EngineSize"].'cc</li>
          </ul>
          <button href="#" class="btn h4-style checked-btn hover-listing-btn"><span class="glyphicon glyphicon-ok"></span> History checked 
          </button>
          <button href="#" class="btn h4-style more-details-btn hover-listing-btn tst-mre-btn"><span class="glyphicon glyphicon-list"></span> More details 
          </button>
          <button href="#" class="btn h4-style test-drive-btn hover-listing-btn tst-mre-btn"><span class="test-drive-glyph"></span> Test drive 
          </button>
          <h4 class="h4-style listing-photos-count"><span class="glyphicon glyphicon-camera"></span> 5 More photos</h4>
        </div>
          ';
      } ?>

The 'Make' is added to the listing-container div to add a class to be able to filter the results with jQuery.

Here is the form with the select element I am using:

<form>
<select class="form-control select-box">
                 <option value="make-any">Make (Any)</option>
                 <?php while($make = $filterres->fetch(PDO::FETCH_ASSOC))
                 {
                 echo '
                 <option>'.$make["Make"].'</option>
                 ';
                 } ?>
             </select>
             <select class="form-control last-select select-box">
                 <option value="model-any">Model (Any)</option>
                 <option value="two">Two</option>
                 <option value="three">Three</option>
                 <option value="four">Four</option>
                 <option value="five">Five</option>
             </select>
</form>

As you can see the select option contains the 'Make' and is looped.

So down to the jQuery:

<script>//Wait for DOM to load
(function() {
    $(“.select-box”).change( function() {

        // get the value of the select element
        var make = $(this).val();


        //get all of the listing-container divs, remove the ones with the selected make class, then hide the rest
        $(“.listing-container”).not(“.” + make).hide();
    });
});</script>

So in theory this should work but for some reason it isn't, can anybody notice anything that might be wrong?

I have placed my script below the core jQuery in my footer and it still doesn't work.

Here is a live example: http://www.drivencarsales.co.uk/used-cars.php

Upvotes: 0

Views: 846

Answers (2)

JoobyPM
JoobyPM

Reputation: 11

If I understand you correctly ↓ working code

$(function() {
   $('.select-box').on("change",function() {
       var make = this.value;
       $('div.listing-container.'+make+",div.listing-container."+make+" + div.listing-container-spec").show();
       $('div.listing-container:not(.'+make+'),div.listing-container:not(.'+make+') + div.listing-container-spec').hide();
   });
});

And shorter code (but slower):

$(function() {
   $('.select-box').on("change",function() {
       var make = this.value;
       $('.listing-container.'+make+",.listing-container."+make+" + div").show();
       $('.listing-container:not(.'+make+'),.listing-container:not(.'+make+') + div').hide();
   });
});

P.S.You miss value attribute (but in live example everything ok):

echo '<option value="'.$make["Make"].'">'.$make["Make"].'</option>';

Upvotes: 1

RobbieP
RobbieP

Reputation: 698

Looks like you're using the wrong quotes in the source code of that page try replacing them with "

//Wait for DOM to load
$(function() {
    $(".select-box").change( function() {

        // get the value of the select element
        var make = $(this).val();


        //get all of the listing-container divs, remove the ones with the selected make class, then hide the rest
        $(".listing-container").not("." + make).hide().next().hide();
    });
});

Edit You also need a $ before the function

Upvotes: 1

Related Questions