考虑以下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;
});
});
我有三个标签或菜单项:当您点击一个标签或菜单项时,此代码将隐藏其他标签或内容部分。
除此之外,以下部分是这个问题的焦点:
$target = $(event.target);
var tabPics = $('#tab-pics>a');
if($target === tabPics){
tabTest.getPics();
}
正如代码段所示,我正在尝试在单击图片选项卡时调用函数。在我的代码使用断点之后,我看到我成功捕获$ target但是,即使它与tabPics匹配,也会跳过函数调用,其余代码正常运行。
如果我匹配$ target和tabPics,为什么当我在if语句中遇到条件时它会跳过函数调用?
感谢您的帮助。
答案 0 :(得分:3)
您的原始方式无效,因为您正在测试两个不同对象的相等性:
var $target = $(event.target);
var tabPics = $('#tab-pics>a');
当你在选择器或现有的dom元素上调用jQuery时,它会返回一个自身的版本,包含它决定匹配的元素。每次此对象不同时,请执行以下代码:
if ( $target === tabPics ) {
/// this wont be reached
}
与说法相同:
if ( {} === {} ) {
/// neither will this
}
虽然上面的代码两个对象在视觉上看起来都是一样的,即使你这样做:
if ( {a:123} === {a:123} ) {
/// nope...
}
JavaScript仍会将上述内容视为false,因为在使用===
比较对象时,对象必须是完全相同的对象,它们不能是具有相同内容的不同对象。
以下链接可能有用:
How would you compare jQuery objects?
希望能够消除困惑。我可以看到你的逻辑在哪里,而在另一种语言中它可能是有意义的,它不是===
在测试对象时在JavaScript中的工作方式。
答案 1 :(得分:0)
您目前无法在jquery(.entry-link:not)中定位伪选择器来设置CSS属性。
答案 2 :(得分:0)
我解决了这个问题。虽然我仍然认为这段代码应该有效:
if($target === tabPics){
tabTest.getPics();
}
它出于某种原因不...但使用.is()确实有效!所以现在代码看起来像这样:
$target = $(event.target);
var tabPicsLi = $('#tab-pics');
var tabPics = $('a', tabPicsLi);
if($target.is(tabPics)){
tabTest.getPics();
}
它的工作正常。也就是说,如果有人应该看到这篇文章,请查看我的原始代码构造,看看为什么这种特殊方式不起作用,我真的很感激回复。从错误中吸取教训对我来说是非常宝贵的。