これを試してください:
$(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>
これですべてが説明されることを願っています。:)