2012-04-26 63 views
3

对不起,如果标题不准确 - 我无法弄清楚如何说出它。jQuery - 如何选择父级的子元素?

我有相同的类<div class="widget"></div>多个部件 - 每个插件都有标题和内容,结构是这样的:

<div class="widget"> 
    <div class="widget-title">Title</div> 
    <div class="widget-content">Content Here</div> 
</div> 

“微件内容”是隐藏的,当你点击小工具-title,内容出现,一个类被应用到widget标题,将其改为“widget-title open”。这部分工作发现,并且小部件内容也打开。

问题是,它打开所有小部件上的小部件内容。它只应该在标题被点击的特定小部件中打开小部件内容,而不是所有这些内容。我不确定使用正确的语法,所以它只打开用户点击标题的特定小部件的小部件内容。

这里是我到目前为止的代码:

$('.widget').find('.widget-title').click(function() { 
    $('.widget-content').show('slow', function() { 
    // Animation complete. 
    }); 
    $('.widget').find('.widget-title').addClass("open"); 
}); 

可能有人请提供一个工作的例子吗?由于

+1

发布您的html结构,我会提供更具体的答案。 – rgin 2012-04-26 18:21:27

+0

对我来说太迟了回答 - 但是,是的,这个概念是,你应该在点击事件中使用jQuery的宝贵'$(this)'来区分不同的小部件,以及你点击的实际jQuery对象。 – 2012-04-26 18:23:13

回答

15
$('.widget .widget-title').click(function() { 
    $(this) 
     .addClass("open") 
     .parent().find('.widget-content').show('slow', function() { 
      // Animation complete. 
     }); 
}); 
+0

这工作正常,非常感谢你给我看,我会记住这对未来!我认为我可能需要使用$(this)函数,但我不知道该怎么做!太棒了。 – 2012-04-26 18:24:31

+3

为什么添加展示前开放的课程?那么在这个节目的回调中加入类是不是更好,因为那是它“开放”的点。 – 2012-04-26 18:26:34

+2

为什么不使用'children'?Find()在这种情况下不需要,只会减慢脚本速度。 – 2012-04-27 14:10:03

2

我想你想要这样的:

$('.widget').find('.widget-title').click(function() { 
    $(this).parent().show('slow', function() { 
     // Animation complete. 
    }).addClass("open"); 
}); 

它打开所选.widget-title元素的父。

+0

这个答案不正确。用户想要在单击小部件标题时显示内容,而不是已经可见的小部件。应该使用选择器children()来代替。 – 2012-04-26 18:44:10

0
$('div.widget-title').click(function() { 
var el = $(this); 
el.addClass('open');siblings('div.widget-content').show('slow',function() { 
    //animation complete 
}); 
}); 

你需要使用“这个”关键字是指当前的DOM元素,以保持回调函数的上下文。否则,您只需在回调中使用一组widget标题抓取所有DOM元素。

0

如果您按类选择,jquery将选择该类的所有成员。是否可以为此特定窗口小部件或父容器设置ID或属性?

2

试试这个:

$('.widget-title').click(function() { 
    $(this).parent('.widget').children('.widget-content').show('slow', function() { 
    $(this).addClass('open'); 
    }); 
});