可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm trying to use show/hide on a submenu. It looks like this:
- Parent 1
- Parent 2
- Child A
- Child B
- Parent 3
- Child C
- Child D
I only want to show the submenu when I click on its parent. Currently, whenever I click on any parent, I get all of the submenus.
Like so: http://jsfiddle.net/saltcod/z7Zgw/
Also, clicking on a link in the submenu toggles the menu back up.
回答1:
//select all the `` element that are children of the `.parent` element $('.parent').children().click(function(){ //now find the `.child` elements that are direct children of the clicked `` and toggle it into or out-of-view $(this).children('.child').slideToggle('slow'); });
Demo: http://jsfiddle.net/jasper/z7Zgw/1/
Basically the code above uses this
to reference the clicked
element so we can find the .child
element that is a child of the clicked
element.
This: $('.child')
Changed to: $(this).children('.child')
Update
Also you can stop the propagation of the click
event on the nested .child
elements like this:
$('.parent').children().click(function(){ $(this).children('.child').slideToggle('slow'); //select all the `.child` elements and stop the propagation of click events on the elements }).children('.child').click(function (event) { event.stopPropagation(); });
Demo: http://jsfiddle.net/jasper/z7Zgw/9/
Docs:
回答2:
Your code was:
$('.parent li').click(function(){ event.preventDefault(); $('.child').slideToggle('slow'); });
$('.child')
selects all the "children". Change it to $('.child', this)
, to select only the ones inside the current element.
The click
event bubbles, so in order to ensure that only clicking the parent itself toggles the state, you can compare the event.target
with this
.
However, this is quicker:
$('.parent > li > a').click(function(){ event.preventDefault(); $(this).parent().find('.child').slideToggle('slow'); });
See fiddle
EDIT as @Jasper pointed out, this is shorter/quicker:
$('.parent > li > a').click(function(){ event.preventDefault(); $(this).siblings('.child').slideToggle('slow'); });