您需要将对 i 的引用作为参数传递给内部函数,以便 i 现在是函数的本地。看来您正在基于单击绑定多个事件到外部 div,然后将多个单击事件绑定到 div 的内部锚标记以隐藏所有不是锚标记父级的 div。
这是我的解决方案:
HTML
<div id="wrapper">
<div class='container container1'>
<div class='content'>
<h1><a href='#'>Title</a></h1>
<p>Content</p>
</div>
</div>
<div class='container container2'>
<div class='content'>
<h1><a href='#'>Title</a></h1>
<p>Content</p>
</div>
</div>
<div class='container container3'>
<div class='content'>
<h1><a href='#'>Title</a></h1>
<p>Content</p>
</div>
</div>
</div>
JavaScript
var $context = $('#wrapper'),
$containers = $('#wrapper').find('div.container');
$context.on('click', '.container a', function() {
var $theAnchorClicked = $(this),
parentClassofAnchor = $this.parent().parent().parent().prop('class');
$containers.each(function() {
$theCurrentContainer = $(this);
if (!$(this).hasClass(parentClass)) $(this).hide();
});
});
首先,我将所有“容器”div 包装在一个包装 div(“#wrapper”)中,该 div 用作查找容器的上下文。这仅仅是因为通过 id、标签或在上下文中查找元素比通过类名查找要快得多。总是。
我保存了对包装器($context)的引用,然后从 $context 中找到了所有具有类“容器”的 div,并保存了对它的引用。
其次,当单击上下文中的链接时,我将单击事件委托给 $context,而不是将单击函数绑定到每个链接(绑定了 1 个事件而不是 20 个)。我也在使用 jQuery 的 .on() 方法,因为它被推荐用于 jQuery 1.7+。
那么委托给 $context 的 click 事件发生了什么?.on() 方法在匹配 '.container a' 的元素上指定一个 'click' 事件,然后指定要执行的函数。在函数中,这是对被点击链接的引用。
单击的链接以及父 div.container 的类被保存,例如“.container .container1”。您会注意到,由于链接嵌套在其他几个元素中,因此需要遍历多个父级才能找到它。
现在这些都保存了,我正在使用 jQuery 的 .each() 方法遍历我们保存在 $containers 中的所有容器。我们需要检查所有没有我们找到的类的容器(parentClassofAnchor)并隐藏它们。在 .each() 函数中,这不是对链接的引用,它现在是对循环中当前 div.container ($theCurrentContianer) 的引用。然后我们使用一个简单的 if 语句来检查它是否没有我们想要显示的类,在这种情况下我们隐藏那个 div。
我希望这有帮助!如果您希望对点击事件做更多事情,请告诉我。