39

I'm trying to use jQuery to open / close control 'boxes' on a webpage. Unfortunately, it doesn't look very good to close a box just to re-open it if the user happens to click on the already opened box. (Boxes are mutually exclusive).

The code I'm using doesn't work, and I'm not sure why. I still get a box closing just to open up anew, which isn't the desired functionality. I created the 'val' variable for debugging purposes; in the debugger, it shows 'val' as having the exact same value as $(this), which should prevent it from getting to the .slideToggle() inside the if statement, but doesn't.

function openBox(index)
{
  val = $('#box' + index);
  $('.profilePageContentBox').each(function(){
      if($(this).css('display') != 'none')
      {
        if($(this) != val)
        {
          $(this).slideToggle(200);
        }
      }
    });
  val.slideToggle(200);
}
1

3 Answers 3

88

You can also do:

 if(val.is(this))
Sign up to request clarification or add additional context in comments.

3 Comments

Simple and straight forward. Great answer
best answer here. kudos!
The Object.is() method determines whether two values are the same value, this is the correct answer and this is how you fish with your bare hands :D
53

Using the $() function will always create a new object, so no matter what, your equality check there will always fail.

For example:

var div = document.getElementById('myDiv');

$(div) === $(div);   // false!

Instead, you could try just storing the actual DOM elements, since those are just referred to inside jQuery objects.

val = $('#box'+index).get(0);
...
if (this !== val) { }

2 Comments

Thanks! As soon as StackOverflow lets me I'll accept this answer. Not only did you answer the question itself, you also explained the conceptual flaw that was screwing me up -- 'give a man a fish, teach a man to fish'
this guy taught you how to fish with a fishing pole (lame), the bottom answer teaches you how to fish with your bare hands (BA)!
0

Try this:

function openBox(index)
{
val=$('#box'+index);
$('.profilePageContentBox').each(function(){
    if($(this).is(":visible"))
    {
        if(!$(this).is("#box"+index))
            $(this).slideToggle(200);
    }
});
val.slideToggle(200);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.