views:

161

answers:

5

Hey all, I am no jQuery expert, but I'm learning. I'm using a bit (growing to a LOT) of jQuery to hide some images and show a single image when a thumb is clicked. While this bit of jQuery works, it's horribly inefficient but I am unsure of how to simplify this to something that works on more of a universal level.

<script>


$(document).ready(function () {

// Changing the Materials
$("a#shirtred").click(function () {
    $("#selectMaterials img").removeClass("visible");
    $("img.selectShirtRed").addClass("visible");
});

$("a#shirtgrey").click(function () {
    $("#selectMaterials img").removeClass("visible");
    $("img.selectShirtGrey").addClass("visible");
});

$("a#shirtgreen").click(function () {
    $("#selectMaterials img").removeClass("visible");
    $("img.selectShirtGreen").addClass("visible");
});

$("a#shirtblue").click(function () {
    $("#selectMaterials img").removeClass("visible");
    $("img.selectShirtBlue").addClass("visible");
});

// Changing the Collars
$("a#collarred").click(function () {
    $("#selectCollar img").removeClass("visible");
    $("img.selectCollarRed").addClass("visible");
});

$("a#collargrey").click(function () {
    $("#selectCollar img").removeClass("visible");
    $("img.selectCollarGrey").addClass("visible");
});

$("a#collargreen").click(function () {
    $("#selectCollar img").removeClass("visible");
    $("img.selectCollarGreen").addClass("visible");
});

$("a#collarblue").click(function () {
    $("#selectCollar img").removeClass("visible");
    $("img.selectCollarBlue").addClass("visible");
});

// Changing the Cuffs
$("a#cuffred").click(function () {
    $("#selectCuff img").removeClass("visible");
    $("img.selectCuffRed").addClass("visible");
});

$("a#cuffgrey").click(function () {
    $("#selectCuff img").removeClass("visible");
    $("img.selectCuffGrey").addClass("visible");
});

$("a#cuffblue").click(function () {
    $("#selectCuff img").removeClass("visible");
    $("img.selectCuffBlue").addClass("visible");
});

$("a#cuffgreen").click(function () {
    $("#selectCuff img").removeClass("visible");
    $("img.selectCuffGreen").addClass("visible");
});

// Changing the Pockets
$("a#pocketred").click(function () {
    $("#selectPocket img").removeClass("visible");
    $("img.selectPocketRed").addClass("visible");
});

$("a#pocketgrey").click(function () {
    $("#selectPocket img").removeClass("visible");
    $("img.selectPocketGrey").addClass("visible");
});

$("a#pocketblue").click(function () {
    $("#selectPocket img").removeClass("visible");
    $("img.selectPocketBlue").addClass("visible");
});

$("a#pocketgreen").click(function () {
    $("#selectPocket img").removeClass("visible");
    $("img.selectPocketGreen").addClass("visible");
});

});
</scrip>

<!-- Thumbnails which can be clicked on to toggle the larger preview image -->


        <div class="materials">
    <a href="javascript:;" id="shirtgrey"><img src="/grey_shirt.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="shirtred"><img src="red_shirt.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="shirtblue"><img src="hblue_shirt.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="shirtgreen"><img src="green_shirt.png" height="122" width="122" /></a> 
    </div>


    <div class="collars">
    <a href="javascript:;" id="collargrey"><img  src="grey_collar.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="collarred"><img  src="red_collar.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="collarblue"><img  src="blue_collar.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="collargreen"><img  src="green_collar.png" height="122" width="122" /></a>
    </div>

    <div class="cuffs">
    <a href="javascript:;" id="cuffgrey"><img  src="grey_cuff.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="cuffred"><img  src="red_cuff.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="cuffblue"><img  src="blue_cuff.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="cuffgreen"><img  src="/green_cuff.png" height="122" width="122" /></a>
    </div>

    <div class="pockets">
    <a href="javascript:;" id="pocketgrey"><img  src="grey_pocket.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="pocketred"><img  src=".png" height="122" width="122" /></a> 
    <a href="javascript:;" id="pocketblue"><img  src="blue_pocket.png" height="122" width="122" /></a> 
    <a href="javascript:;" id="pocketgreen"><img  src="green_pocket.png" height="122" width="122" /></a>
    </div>

<!-- The larger images where one from each set should be viewable at one time, triggered by the thumb clicked above -->


        <div class="selectionimg"> 
        <div id="selectShirt">
        <img src="grey_shirt.png" height="250" width="250" class="selectShirtGrey show" />        
        <img src="red_shirt.png" height="250" width="250" class="selectShirtRed hide" />        
        <img src="blue_shirt.png" height="250" width="250" class="selectShirtBlue hide" />        
        <img src="green_shirt.png" height="250" width="250" class="selectShirtGreen hide" />  </div>

         <div id="selectCollar">
        <img src="grey_collar.png" height="250" width="250" class="selectCollarGrey show" />        
        <img src="red_collar.png" height="250" width="250" class="selectCollarRed hide" />        
        <img src="blue_collar.png" height="250" width="250" class="selectCollarBlue hide" />        
        <img src="green_collar.png" height="250" width="250" class="selectCollarGreen hide" />       </div>

         <div id="selectCuff">
        <img src="grey_cuff.png" height="250" width="250" class="selectCuffGrey show" />        
        <img src="red_cuff.png" height="250" width="250" class="selectCuffRed hide" />        
        <img src="blue_cuff.png" height="250" width="250" class="selectCuffBlue hide" />        
        <img src="green_cuff.png" height="250" width="250" class="selectCuffGreen hide" />     </div>

         <div id="selectPocket">
        <img src="grey_pocket.png" height="250" width="250" class="selectPocketGrey show" />        
        <img src="hred_pocket.png" height="250" width="250" class="selectPocketRed hide" />        
        <img src="blue_pocket.png" height="250" width="250" class="selectPocketBlue hide" />        
        <img src="green_pocket.png" height="250" width="250" class="selectPocketGreen hide" />   
    </div>     </div>
+10  A: 
$("a[color]").each(function() {        
    $(this).click(function () {
        var color = $(this).attr('color');
        $("#selectCuff img").removeClass("visible");
        $("img[color="+color+"]").addClass("visible");
    });
});

like that?

Also you can play with context css classes like that

#select img { 
    display:none;
}
#select.red img.red{
    display:inline;
}

and add/remove color class on #select div

I've just realize that you don't even need 'each' here

$("a[color]").click(function() {                
    var color = $(this).attr('color');
    $("#selectCuff img").removeClass("visible");
    $("img[color="+color+"]").addClass("visible");
});

in markup

<a href="#" color="grey">show grey</a>
<div id="select">
<img src="grey_collar.png" height="250" width="250" color="grey" />
<img src="red_collar.png" height="250" width="250" color="red" />
</div>
vittore
Thats pretty cool, much better than my attempt!!
Mark Redman
hope this helps
vittore
This looks amazing. Can you run me through on how this works? Is this solution assuming I am using the CSS color attribute? If so, I am not. My code posted above may have been misleading with the color ID and class names. This page is more of a mockup that will list potentially over 100 types of materials etc.
liquilife
this code suggest you will use custom attribute `color`. Each `img` should have it and each `a`. On `click` of `a` it will takes the value from color attribute of a, hide all `img` and show only `img` that have attribute color with the same value
vittore
I wouldn't get in the habit of storing data in custom attributes. A better option here would be to use classes.
TheJuice
@TheJuice: Totaly agree, that's just the first came in mind
vittore
You can use `data-` attribute in HTML5 (ref: http://ejohn.org/blog/html-5-data-attributes/)
fudgey
@fudgey: looks reasonable, but class attribute is more convenient when using with jquery
vittore
A: 

You could do something like this? (check for corrct case etc..not tested)

<script> 

function setupMaterialsClick(name)
{
   $("a#" + name).click(function () { 
       $("#selectMaterials img").removeClass("visible"); 
       $("img.select" + name).addClass("visible"); 
   }); 
}

$(document).ready(function () 
{ 

   // Changing the Materials 
   setupMaterialsClick("shirtred");
   // etc

   // Other bits

}); 

}); 
</script>
Mark Redman
A: 

Change your classes to match the case of the ids of the links, then do something like:

$('materials a').bind(changeSelection);
$('collars a').bind(changeSelection);
$('cuffs a').bind(changeSelection);
$('pockets a').bind(changeSelection);

function changeSelection()
{
 var id = $(this).attr('id');
 var selectClass = 'img.select'+id;
 $("#selectPocket img").removeClass("visible"); 
 $(selectClass).addClass("visible"); 
}
VexedPanda
A: 
$("a").each(function() {
  $(this).click(function() {
    var src = $(this).children("img").attr("src");
    var img = $(".selectionimg").find("img[src$='"+src+"']");
    img.addClass("visible").siblings().removeClass("visible");
    return false;
  });
});

This assumes, that the selected images are the same src as the corresponding clickable images.

Duddle
A: 

I haven't had a chance to test this with images, but you can shorten your HTML and script as follows:

$(document).ready(function(){
 /* names in the materials variable must match the image file name */
 /* the script will form the filename as follows: grey_shirt.png */
 var materials = {
  'shirt'  : ["grey", "red", "blue", "green"],
  'collar' : ["grey", "red", "blue", "green"],
  'cuff'   : ["grey", "red", "blue", "green"],
  'pocket' : ["grey", "red", "blue", "green"]
 }
 /* Set up Content */
 var i, c = '', s = '<div class="selectionimg">';
 $.each(materials, function(key, value){
  c += '<div class="' + key + '">';
  s += '<div class="select' + key + '">';
  for (i=0; i<value.length; i++) {
   c += '<a href="#" rel="' + value[i] + '"><img class="thumb" src="' + value[i] + '_' + key + '.png"></a>';
   s += '<img src="' + value[i] + '_' + key + '.png" height="250" width="250" class="large-img select' + value[i];
   s += (i==0) ? ' show" />' : ' hide" />'; // add show class only the first selection
  }
  c += '</div>';
  s += '</div>';
 })
 $('#content').html(c + s + '</div>');

 /* Set up scripting */
 $('#content a').click(function(){
  var type = $(this).parent().attr('class');
  var color = $(this).attr('rel');
  $('.select' + type).find('img').removeClass('visible').end()
   .find('img.select' + color).addClass('visible');
  return false;
 })
})
fudgey