var el = $('.container');
var anchors = new Array('jobs', 'portfolio', 'docs', 'interier', 'price');
for (var i = 0; i < anchors.length; i++) {
el.on('click', 'a[href$="#'+anchors[i]+'"]', function (e) {
e.preventDefault();
console.log(anchors[i]);
$.scrollTo('a[name="'+anchors[i]+'"]');
});
};
3 に答える
その要素をクリックするi
と、の値にインクリメントされますanchors.length
。
クリックハンドラーにはへの参照がありi
ます。
JavaScriptでの未解決のプロパティルックアップは。を返しますundefined
。
this
要素への参照として使用する方がはるかに簡単です。i
それ以外の場合は、値を直接参照するのではなく、値で値を渡す方法を見つけてください。
未定義になる理由は、i
が実際にはに等しいため5
です。これを見てください:
for ( var i = 0; i < 5; i++ ) {
console.log( i );
}
そのループが完了した後は、ループi
に対してローカルである必要があるため、現時点では未定義であると考えるでしょうfor
。残念ながら、そうではありません。これをテストする簡単な方法:
for ( var i = 0; i < 5; i++ ) {
console.log( i );
}
console.log( i ) // Logs out 5;
簡単に言えば、i++
forループのofは、真理テスト部分であるi < 5
ビットの後に実行されます。したがって、i
がに等しい場合4
、ループが実行され、その後、ループが増分されi++
、値がi
5に設定され、真理テストに失敗します。
これで、i
がに等しいことがわかったので、配列で5
ルックアップを実行すると、は未定義になります。anchors
anchors[5]
これが重要な理由は、クリックイベントが発生するたびに、キャッシュされた値i
5が実行され、その結果、常に未定義のログが記録されるためです。
i
これを修正するには、 likeの値のエイリアスを作成します。
var el = $('.container');
var anchors = new Array('jobs', 'portfolio', 'docs', 'interier', 'price');
for (var i = 0; i < anchors.length; i++) {
// By passing the value to this self executing function,
// it creates a new instance of the variable
( function ( index ) {
el.on('click', 'a[href$="#'+anchors[index]+'"]', function (e) {
e.preventDefault();
console.log(anchors[index]);
$.scrollTo('a[name="'+anchors[index]+'"]');
});
})( i );
};
変数i
は最後のループの値を取得しました。アンカーにアクセスする場合は、次を使用できます。
console.log($(this).attr('href').substr(1));