Reputation: 4204
I have created a menu that changes to a burger navigation when the browser is resized down to mobile. The problem is that if I resize it to mobile, then back to desktop, then back to mobile again, the menu stops working.
I will create a fiddle in a bit, but can anyone see why this would be happening from the jQuery below?
if(window.innerWidth < 960) {
jQuery('header nav .main').hide();
jQuery('header nav .main').removeAttr('style');
jQuery('header .mob-nav .menu').removeAttr('style');
jQuery('header .mob-nav .menu').removeClass('selected');
jQuery('header .mob-nav .menu').on('click', function(){
if( jQuery(this).hasClass('selected') ) {
jQuery(this).removeClass('selected');
jQuery('header nav .main').stop().slideUp()
} else {
jQuery(this).addClass('selected');
jQuery('header nav .main').stop().slideDown();
}
});
} else {
jQuery('header nav .main').removeAttr('style');
}
Upvotes: 0
Views: 186
Reputation: 18061
This probably happens because every time the window is resized below 960 pixels an additional click-handler is attached to 'header .mob-nav .menu'. Unbind the previously attached handler first, using 'off'. Try changing it to:
if(window.innerWidth < 960) {
jQuery('header nav .main').hide();
jQuery('header nav .main').removeAttr('style');
jQuery('header .mob-nav .menu').removeAttr('style');
jQuery('header .mob-nav .menu').removeClass('selected');
jQuery('header .mob-nav .menu').off('click').on('click', function(){
if( jQuery(this).hasClass('selected') ) {
jQuery(this).removeClass('selected');
jQuery('header nav .main').stop().slideUp();
} else {
jQuery(this).addClass('selected');
jQuery('header nav .main').stop().slideDown();
}
});
} else {
jQuery('header nav .main').removeAttr('style');
}
Or consider placing the bind event code outside the function.
Upvotes: 1