Reputation: 798
Consider the following jquery:
$('.entry-links:not(.entry-links-processed)').each(function(){
$(this).addClass('entry-links-processed');
$('li a', this).click(function(event){
$target = $(event.target);
var tabPics = $('#tab-pics>a');
if($target === tabPics){
tabTest.getPics();
}
$('.entry-links li a').removeClass('active');
$(this).addClass('active');
var id = $(this).attr('href');
$('.entry-box:not(' + id + ')').hide();
$(id).show();
return false;
});
});
I have three tabs or menu items: when you click on one, this code will hide the content portion of the others.
Out of this, the following portion is the focus of this question:
$target = $(event.target);
var tabPics = $('#tab-pics>a');
if($target === tabPics){
tabTest.getPics();
}
As the code snippet shows, I'm trying to call a function when the pictures tab is clicked. Following my code using breakpoints, I see that I'm capturing the $target successfully and yet, even though it matches tabPics, the function call is skipped and the rest of the code runs normally.
If I have matched the $target and tabPics, why would it skip over the function call when I've met the condition in my if statement?
Thanks for the help.
Upvotes: 1
Views: 4294
Reputation: 36005
Your original way did not work because you were testing the equality of two different objects:
var $target = $(event.target);
var tabPics = $('#tab-pics>a');
When you call jQuery on a selector or an existing dom element, it returns a version of itself wrapping the elements that it decides to match. Each time this object is different, so the following code:
if ( $target === tabPics ) {
/// this wont be reached
}
Is the same as saying:
if ( {} === {} ) {
/// neither will this
}
And whilst the above code both objects visually look the same, even if you do:
if ( {a:123} === {a:123} ) {
/// nope...
}
JavaScript will still treat the above as false, because when comparing objects using ===
the objects have to be the exact same object, they can't be different objects with the same content.
The following link could be of use:
How would you compare jQuery objects?
Hope that clears up the confusion. I can see where your logic was going, and in another language it could make sense, it's just not how ===
works in JavaScript when testing objects.
Upvotes: 3
Reputation: 798
I resolved the issue. While I still think this code should work:
if($target === tabPics){
tabTest.getPics();
}
It for some reason does not ... but using .is() does indeed work! So now the code looks like this:
$target = $(event.target);
var tabPicsLi = $('#tab-pics');
var tabPics = $('a', tabPicsLi);
if($target.is(tabPics)){
tabTest.getPics();
}
And it works just as it should. That said, if someone should see this post, review my original code construct and see why that particular way didn't work, I would really appreciate a reply. Learning from my mistakes is invaluable to me.
Upvotes: 0
Reputation: 1150
You are currently unable to target psuedo selectors in jquery (.entry-link:not) to set CSS properties.
Upvotes: 0