This is my first question on stackoverflow so hopefully I'm doing it right.
I ran into an issue where a variable was passing a seemingly strange value through a click event. I figured out a different way to do it, but I'm curious as to why my original method wasn't working. I have a feeling it is a weird scoping rule of JS, so if someone could clarify, that would be great. The code was supposed to switch back and forth between two tabs on a click event. I'm sorry if this has already been answered, but in looking at others' questions I couldn't really tell if it was the same issue that I was having.
This was my original code, where at program start tab1
had the class active-tab
:
$("#tab1").on('click', {activeTab: $("#tab1").hasClass("active-tab"),
tab1Clicked: true}, changeTab);
$("#tab2").on('click', {activeTab: $("#tab1").hasClass("active-tab"),
tab1Clicked: false}, changeTab);
and elsewhere
function changeTab(event) {
var tab1Active = event.data.activeTab;
var tab1WasClicked = event.data.tab1Clicked;
if(tab1Active) {
if(tab1WasClicked)
alert("tab1 active & clicked, no change");
else {
alert("tab1 active, tab2 clicked, change");
$("#tab1").removeClass("active-tab");
$("#tab2").addClass("active-tab");
}
}
else {//tab2 is active
if(tab1WasClicked) {
alert("tab2 active, tab1 clicked, change");
$("#tab2").removeClass("active-tab");
$("#tab1").addClass("active-tab");
}
else
alert("tab2 active & clicked, no change");
}
}
The problem was that, although the .hasClass
calls returned the correct result, the value of event.data.activeTab
always turned out to be true
, so once tab2
got clicked it never made tab1
active again because it always thought it already was, even though the class did in fact get removed. I solved this by passing only tab1Clicked
through event.data
and just checking $("#tab1").hasClass("active-tab")
directly in the function changeTab
, which is probably what I should have been doing from the beginning, but still, can someone explain to me why this other method didn't work equally well?