Javascript jQuery增量故障

Javascript jQuery增量故障,javascript,jquery,Javascript,Jquery,我正在尝试使用jQuery来浏览带有增量类的部分。但是我的jQuery代码看起来是错误的。控制台中有此消息 TypeError: nextSection.offset(...) is undefined 这是我的密码: for(var i = 0; i < 11; i++) { $('.project-' + i + '> .arrows > .arrow-bottom').click(function() { $('html, body').anim

我正在尝试使用jQuery来浏览带有增量类的部分。但是我的jQuery代码看起来是错误的。控制台中有此消息

TypeError: nextSection.offset(...) is undefined
这是我的密码:

for(var i = 0; i < 11; i++) {
    $('.project-' + i + '> .arrows > .arrow-bottom').click(function() {
        $('html, body').animate({
            scrollTop: $('.project-' + i+1).offset().top()
        }, 750);
    });
for(变量i=0;i<11;i++){
$('.project-'+i+'>.arrows>.arrow-bottom')。单击(函数(){
$('html,body')。设置动画({
scrollTop:$('.project-'+i+1).offset().top()
}, 750);
});
有人知道为什么它不起作用


谢谢!

问题可能在于闭包,请尝试将代码更改为:

for (var i = 0; i < 11; i++) {
  (function(j) {
    $('.project-' + j + '> .arrows > .arrow-bottom').click(function() {
      $('html, body').animate({
        scrollTop: $('.project-' + (j + 1)).offset().top()
      }, 750);
    });
  }(i));
}
for(变量i=0;i<11;i++){
(职能(j){
$('.project-'+j+'>.arrows>.arrow-bottom')。单击(函数(){
$('html,body')。设置动画({
scrollTop:$('.project-'+(j+1)).offset().top()
}, 750);
});
}(i) );
}
你可以参考这篇文章,了解更多关于闭包及其工作原理的信息,

问题可能在于闭包,请尝试将代码更改为:

for (var i = 0; i < 11; i++) {
  (function(j) {
    $('.project-' + j + '> .arrows > .arrow-bottom').click(function() {
      $('html, body').animate({
        scrollTop: $('.project-' + (j + 1)).offset().top()
      }, 750);
    });
  }(i));
}
for(变量i=0;i<11;i++){
(职能(j){
$('.project-'+j+'>.arrows>.arrow-bottom')。单击(函数(){
$('html,body')。设置动画({
scrollTop:$('.project-'+(j+1)).offset().top()
}, 750);
});
}(i) );
}
你可以参考这篇文章,了解更多关于闭包及其工作原理的信息,

所有事件侦听器都将引用相同的
i
,每次都会递增(直到
i
成为边界
11
)因此,当调用事件侦听器时,它们将访问它们得到的
i
引用的值,对于所有的事件侦听器,该值都是
11
。因此
scrollTop:$('.project-'+i+1)。offset().top()
对于所有的项目(我假定不是元素),都是
scrollTop:$('.project-'+12)。offset().top()
因此,
偏移量
将是
未定义的

您可以使用iLifeI中间InvokedFfunctionExpression)为每个迭代创建单独的闭包,因此事件侦听器将具有如下唯一值:

for(var i = 0; i < 11; i++) {
    (function(index) { // index will be created for each iteration (new one every time)
        // instead of i use index
        $('.project-' + index + '> .arrows > .arrow-bottom').click(function() {
            $('html, body').animate({
                scrollTop: $('.project-' + index + 1).offset().top()
            }, 750);
        });
    })(i); // pass i to the call to initialize index of the IIFE
}
for(变量i=0;i<11;i++){
(函数(索引){//每次迭代都将创建索引(每次都新建一个)
//我不使用索引,而是使用索引
$('.project-'+index+'>.arrows>.arrow-bottom')。单击(函数(){
$('html,body')。设置动画({
scrollTop:$('.project-'+index+1).offset().top()
}, 750);
});
})(i) ;//将i传递给初始化IIFE索引的调用
}

所有事件侦听器都将引用相同的
i
,每次都会递增(直到
i
成为边界
11
)因此,当调用事件侦听器时,它们将访问它们得到的
i
引用的值,对于所有的事件侦听器,该值都是
11
。因此
scrollTop:$('.project-'+i+1)。offset().top()
对于所有的项目(我假定不是元素),都是
scrollTop:$('.project-'+12)。offset().top()
因此,
偏移量
将是
未定义的

您可以使用iLifeI中间InvokedFfunctionExpression)为每个迭代创建单独的闭包,因此事件侦听器将具有如下唯一值:

for(var i = 0; i < 11; i++) {
    (function(index) { // index will be created for each iteration (new one every time)
        // instead of i use index
        $('.project-' + index + '> .arrows > .arrow-bottom').click(function() {
            $('html, body').animate({
                scrollTop: $('.project-' + index + 1).offset().top()
            }, 750);
        });
    })(i); // pass i to the call to initialize index of the IIFE
}
for(变量i=0;i<11;i++){
(函数(索引){//每次迭代都将创建索引(每次都新建一个)
//我不使用索引,而是使用索引
$('.project-'+index+'>.arrows>.arrow-bottom')。单击(函数(){
$('html,body')。设置动画({
scrollTop:$('.project-'+index+1).offset().top()
}, 750);
});
})(i) ;//将i传递给初始化IIFE索引的调用
}

循环内闭包的老问题!你的意思是什么?;)将
offset().top()
更改为
offset().top
仅使用一个类来拾取数据id所需的位置关闭循环内闭包的老问题!你的意思是什么?;)将
offset().top()更改为
offset().top
仅使用一个类来选择数据id为您所需位置的pick?这是一个更全面的解释,尽管这不是第一个正确答案。@PeterBehr由于我正在寻找重复的问题,所以花了一些时间来编写它,以便投票关闭它,因为这个问题很普遍,但没有发现任何问题ng重定向到。这是一个更彻底的解释,尽管它不是第一个正确的答案。@PeterBehr我花了一些时间来写它,因为我正在寻找重复的问题,所以投票结束它,因为这个问题很普遍,但没有找到什么强烈的重定向到。次要的风格注释,在第二行到最后一行,传递了参数t到匿名函数accounts/在被调用函数表达式的括号内,
}(i)),但我通常看到它放在外面,
(I),因为将未命名的函数语句放在括号中会强制它作为函数表达式进行计算,然后我们使用参数
i
调用函数表达式。另一种方法仍然有效,因为函数表达式是可立即调用的,但与函数声明从不可调用这一事实相冲突,因此它们后面永远不会有参数列表
是Crockford风格的…应该先读维基百科。哦,好吧……品味的问题。在这种情况下,你应该非常小心你的括号。iLife模式之前的内容有时会给您带来很大的问题,请分别尝试以下两行,并找出第一行中出现错误的原因。var fun=函数(x){console.log(x.toLowerCase());}(函数(j){fun(j);}(“文本”)////