事件目标匹配,但没有调用函数?

时间:2013-03-21 06:52:43

标签: javascript jquery

考虑以下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语句中遇到条件时它会跳过函数调用?

感谢您的帮助。

3 个答案:

答案 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();
            }

它的工作正常。也就是说,如果有人应该看到这篇文章,请查看我的原始代码构造,看看为什么这种特殊方式不起作用,我真的很感激回复。从错误中吸取教训对我来说是非常宝贵的。