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]+'"]');
});
};
问问题
284 次
3 回答
3
当您单击该元素时,i
将增加到 的值anchors.length
。
您的点击处理程序具有对i
.
JavaScript 中未解析的属性查找返回undefined
.
this
用作元素的引用会容易得多。否则,找到一种i
按值传递值的方法,而不是直接引用它。
于 2013-03-21T10:01:27.173 回答
1
你得到未定义的原因是因为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 循环在真值测试部分i < 5
bit 之后执行。因此,当i
等于 时4
,循环运行,然后它增加i++
,这将值设置i
为 5,这反过来又使真值测试失败。
因此,既然您知道i
等于5
,那么当您在anchors
数组中进行查找时,anchors[5]
它是未定义的。
这很重要的原因是因为每次点击事件触发时,它都会执行缓存值i
5,反过来,您将始终记录 undefined
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 );
};
于 2013-03-21T10:06:49.737 回答
0
变量i
获得了最后一个循环的值。如果要访问锚点,可以使用:
console.log($(this).attr('href').substr(1));
于 2013-03-21T10:07:35.790 回答