chasemb
chasemb

Reputation: 167

How to consolidate Jquery into cleaner format

I need a little help consolidating my code. This is the working code but I can't seem to get it when I try and simplify.

I wrote it with jquery and I've new to javascript as a whole. It's basically a loop but I'm not sure how to loop it through.

<script type="text/javascript">
// house_one
    $('.house_one')
    .mouseenter(function() {
      $('.box_one').addClass('hover');
    })
    .mouseleave(function() {
      $('.box_one').removeClass('hover');
    });
    $('.box_one')
    .mouseenter(function() {
      $('.house_one').addClass('house_hover');
    })
    .mouseleave(function() {
      $('.house_one').removeClass('house_hover');
    });
//house_two
    $('.house_two')
    .mouseenter(function() {
      $('.box_two').addClass('hover');
    })
    .mouseleave(function() {
      $('.box_two').removeClass('hover');
    });
            $('.box_two')
    .mouseenter(function() {
      $('.house_two').addClass('house_hover');
    })
    .mouseleave(function() {
      $('.house_two').removeClass('house_hover');
    });
// house_three
    $('.house_three')
    .mouseenter(function() {
      $('.box_three').addClass('hover');
    })
    .mouseleave(function() {
      $('.box_three').removeClass('hover');
    });
    $('.box_three')
    .mouseenter(function() {
      $('.house_three').addClass('house_hover');
    })
    .mouseleave(function() {
      $('.house_three').removeClass('house_hover');
    });
// house_four
    $('.house_four')
    .mouseenter(function() {
      $('.box_four').addClass('hover');
    })
    .mouseleave(function() {
      $('.box_four').removeClass('hover');
    });
    $('.box_four')
    .mouseenter(function() {
      $('.house_four').addClass('house_hover');
    })
    .mouseleave(function() {
      $('.house_four').removeClass('house_hover');
    });
// house_five
    $('.house_five')
    .mouseenter(function() {
      $('.box_five').addClass('hover');
    })
    .mouseleave(function() {
      $('.box_five').removeClass('hover');
    });
    $('.box_five')
    .mouseenter(function() {
      $('.house_five').addClass('house_hover');
    })
    .mouseleave(function() {
      $('.house_five').removeClass('house_hover');
    });
// house_six
    $('.house_six')
    .mouseenter(function() {
      $('.box_six').addClass('hover');
    })
    .mouseleave(function() {
      $('.box_six').removeClass('hover');
    });
    $('.box_six')
    .mouseenter(function() {
      $('.house_six').addClass('house_hover');
    })
    .mouseleave(function() {
      $('.house_six').removeClass('house_hover');
    });
// house_seven
    $('.house_seven')
    .mouseenter(function() {
      $('.box_seven').addClass('hover');
    })
    .mouseleave(function() {
      $('.box_seven').removeClass('hover');
    });
    $('.box_seven')
    .mouseenter(function() {
      $('.house_seven').addClass('house_hover');
    })
    .mouseleave(function() {
      $('.house_seven').removeClass('house_hover');
    });
// house_eight
    $('.house_eight')
    .mouseenter(function() {
      $('.box_eight').addClass('hover');
    })
    .mouseleave(function() {
      $('.box_eight').removeClass('hover');
    });
    $('.box_eight')
    .mouseenter(function() {
      $('.house_eight').addClass('house_hover');
    })
    .mouseleave(function() {
      $('.house_eight').removeClass('house_hover');
    });
</script>

Upvotes: 1

Views: 102

Answers (2)

Fresheyeball
Fresheyeball

Reputation: 30015

function setupHovers(house, box){
    house = $(house);
    box   = $(box);
    house.hover(function(){  box.toggleClass('hover');  });
    box.hover(function(){    house.toggleClass('house_hover');  });
}

boxHouseArray = ['one','two','three','four','five','six' ...]; //

for(boxHouse in boxHouseArray){
   setupHovers('.house_'+boxHouse, '#box_'+boxHouse);
}

or even better change your markup slightly:

<a href="/interiors/house_1" class="house_list">House 04</a>
 and
<div class="box"></div>

now you can go like this:

var houses = $('.house_list'), boxes = $('.box');
houses.hover(function(){
    boxes.eq( houses.index(this) ).toggleClass('hover'); 
});
boxes.hover(function(){
    houses.eq( boxes.index(this) ).toggleClass('house_hover'); 
});

The idea here is no extra id's or markup, we simply use the order of the elements in the markup as our configuration. Lets say we mouse over the first box: index(this) will tell us if its the first box on the page and trigger the hover class on the first house via eq

Upvotes: 0

elclanrs
elclanrs

Reputation: 94101

Just use two classes box and house and all of that can be reduced to this:

$('.house').on('mouseenter mouseleave', function(){
  $(this).closest('.box').toggleClass('hover')
})

$('.box').on('mouseenter mouseleave', function(){
  $(this).closest('.house').toggleClass('house_hover')
})

Edit:

If you're markup doesn't work with closest() because the elements don't share the same container then use ids in addition to the general classes.

$('.house').on('mouseenter mouseleave', function(){
  // Assuming id = house_one (or two, three etc...)
  var id = this.id.split('_')[1]
  $('#box_'+ id).toggleClass('hover')
})

Upvotes: 3

Related Questions