试试这个:
$(document).ready(function () {
'use strict';
$('.topicsShow').hide();
$('.clickFunc').each(function (i, elem) {
//i and elem are parameters passed to .each;
//i naturally increments.
var self = elem; //cache object so that jQuery doesn't do several lookups
self.data('idf', i).click(function (e) {
$('.topicsShow:eq(' + self.data('idf') + ')').toggle('slow');
e.preventDefault(); //cancel bubbling
return false;
});
});
});
我的猜测是您需要$(this).data('idf',i);
在处理程序之前分配click
。
如果这没有帮助,请在您的帖子中添加一些示例标记。
更新:
这适用于您的标记:
$(document).ready(function () {
$('.topicsShow').hide(); //hide topics
$('.clickFunc').each(function (i, elem) {
var self = $(elem) //cache object
self.click(function (e) {
//.nextUntil('.clickFunc') === get all siblings until .clickFunc
//.filter('.topicsShow') === select only elements that have the .topicsShow class
self.nextUntil('.clickFunc').filter('.topicsShow').toggle('slow');
e.preventDefault(); //cancel bubbling
return false;
});
});
});
我的原始代码没有做任何事情的原因是我忘记放入elem
一个 jQuery 包装器(即$(elem)
)。
e.preventDefault();
不会阻止点击事件。相反,它防止点击事件冒泡到更高阶的元素(更远的祖先树)。我包括它是因为我假设您不希望在tr
切换元素后发生任何其他事情。出于同样的原因,我也包括在内return false;
(它可能是多余的,但我不确定是否是,所以无论如何我都包括在内)。
该函数(您在问题中使用的函数:))的目的是将任意值(如变量值,或者在本例中为 的值).data
i
存储到选择器中匹配的 DOM 元素中。
您问题中的代码执行以下操作:
$(document).ready(function () {
$('.topicsShow').hide(); //hide topics
var i = 1; //declare a var for incrementing
$('.clickFunc').each(function () {
$(this).click(function () {
//:eq(0) or :eq(1) as this only loops twice, see notes in markup below
//when you intialized `i` to 1, this became :eq(1) or :eq(2)
$('.topicsShow:eq(' + $(this).data('idf') + ')').toggle('slow');
});
$(this).data('idf', i); //store the value of `i` (0 || 1) || (1 || 2) in the matched element
i++; //increment `i`
});
});
使用此标记:
<tr class="clickFunc"><!-- with var i = 0; click handler toggles .topicsShow:eq(0)-->
<td>clickFunc</td><!-- with var i = 1; click handler toggles .topicsShow:eq(1)-->
<td>clickFunc</td>
</tr>
<tr class="topicsShow"><!-- .topicsShow:eq(0) -->
<td>topicsShow</td>
<td>topicsShow</td>
<td>topicsShow</td>
<td>topicsShow</td>
</tr>
<tr class="topicsShow"><!-- .topicsShow:eq(1) -->
<td>topicsShow</td>
<td>topicsShow</td>
<td>topicsShow</td>
<td>topicsShow</td>
</tr>
<tr class="clickFunc"><!-- click handler toggles :eq(2)-->
<td>clickFunc</td><!-- with var i = 0; click handler toggles .topicsShow:eq(1)-->
<td>clickFunc</td><!-- with var i = 1; click handler toggles .topicsShow:eq(2)-->
<td>clickFunc</td>
<td>clickFunc</td>
</tr>
<tr class="topicsShow"><!-- .topicsShow:eq(2) -->
<td>topicsShow</td>
<td>topicsShow</td>
<td>topicsShow</td>
<td>topicsShow</td>
</tr>
希望这能解释一切。:)