目的
サイト全体のページのいくつかのdivにイベントハンドラーを動的に割り当てたい。
私の方法
jQueryを使用して、選択したdivイベントのハンドラーとして無名関数をバインドしています。
問題
このコードは、div名と関連するURLの配列を繰り返します。div名は、バインディングターゲットを設定するために使用されます。つまり、このイベントハンドラーをこのdivイベントにアタッチします。
イベントハンドラーは各divイベントに正常にバインドされますが、これらのイベントハンドラーによってトリガーされるアクションは、配列の最後のアイテムのみを対象とします。
つまり、ユーザーが特定のdivにマウスを合わせると、そのdivのスライドアウトアニメーションを実行する必要があるという考え方です。ただし、代わりに、div1(rangeTabAll)にマウスを合わせると、div4(rangeTabThm)のスライドアウトアニメーションがトリガーされます。同じことがdiv2、3などにも当てはまります。順序は重要ではありません。配列要素を変更すると、イベントは常に配列の最後の要素div4をターゲットにします。
私のコード-(jQueryを使用)
var curTab, curDiv;
var inlineRangeNavUrls=[['rangeTabAll','range_all.html'],['rangeTabRem','range_remedial.html'],
['rangeTabGym','range_gym.html'],['rangeTabThm','range_thermal.html']];
for (var i=0;i<inlineRangeNavUrls.length;i++)
{
curTab=(inlineRangeNavUrls[i][0]).toString();
curDiv='#' + curTab;
if ($(curDiv).length)
{
$(curDiv).bind("mouseover", function(){showHideRangeSlidingTabs(curTab, true);} );
$(curDiv).bind("mouseout", function(){showHideRangeSlidingTabs(curTab, false);} );
}
}
私の理論
目がくらむほど明白な構文エラーまたは参照渡しの問題が発生していません。最初に、curTabの値を設定するために次のステートメントがありました。
curTab=inlineRangeNavUrls[i][0];
したがって、問題が発生したとき、(forループの反復を介して)curTabへの参照を変更すると、実際には、以前のすべての無名関数イベントハンドラーの参照も新しいcurTab値に変更されていることがわかりました。イベントハンドラーは常に最後のdivをターゲットにしました。
したがって、私が本当に行う必要があるのは、curTabオブジェクト参照ではなく無名関数イベントハンドラーにcurTab値を渡すことでした。
ので、私は考えました:
curTab=(inlineRangeNavUrls[i][0]).toString();
問題は解決しますが、解決しません。同じ取引。したがって、問題に関するいくつかの重要な、そしておそらく非常に基本的な知識が欠けていることは明らかです。ありがとう。