Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript .each()与AJAX函数有关的问题_Javascript_Jquery - Fatal编程技术网

Javascript .each()与AJAX函数有关的问题

Javascript .each()与AJAX函数有关的问题,javascript,jquery,Javascript,Jquery,我有一个显示块的页面。它们是4列4行,共16个街区。 但是,当您到达页面底部时,会有一个AJAX函数,每当您到达页面底部时,它会再加载16个块 我希望为这些块加载动画,我将不透明度从0更改为1,为此,我使用以下代码逐渐向这些元素添加一个类: 对于第1列: .colnum1对应于第1列中的一个块 $('.colnum1').each(function(u){ setTimeout(function(){ $('.colnum1').eq(u).addClass('selected');

我有一个显示块的页面。它们是4列4行,共16个街区。 但是,当您到达页面底部时,会有一个AJAX函数,每当您到达页面底部时,它会再加载16个块

我希望为这些块加载动画,我将不透明度从0更改为1,为此,我使用以下代码逐渐向这些元素添加一个类:

对于第1列: .colnum1对应于第1列中的一个块

$('.colnum1').each(function(u){
  setTimeout(function(){
    $('.colnum1').eq(u).addClass('selected');
  }, 1200 * u);
});
第2栏: .colnum2对应于第2列中的一个块

$('.colnum2').each(function(z){
  setTimeout(function(){
    $('.colnum2').eq(z).addClass('selected');
  }, 300 + 1200 * z);
});
这一切对于前16个元素都非常有效

但是,当我加载接下来的16个元素时,它们在动画加载发生之前出现之前是一个延迟。 我已经弄清楚了这个延迟对应的是什么。。。 当我到达页面底部和jQuery时,每个函数都会再次执行,它们会在新元素之前抛出已经存在的元素。。。这是有道理的,但不是我们想要的

我试图重写函数,这样就不会先抛出已经“加载”的元素

使用此代码:。选定为添加onload动画的类

$('.colnum1:not(.selected)').each(function(u){
  setTimeout(function(){
    $('.colnum1:not(.selected)').eq(u).addClass('selected');
  }, 1200 * u);
});
但由于某些原因,它没有添加类。选择所有元素。。。它跳过了一些等


因此,我想知道如何确保当我获得新的16个元素时。每个函数不会首先抛出所有以前的现有元素,从而导致很长的等待时间?

它未能选择所有元素的原因是它正在重新计算术语$'。colnum1:not.selected',每次调用处理程序时

让我们一步一步地看一遍。我们只关注第一栏

首先,它计算$'.colnum1:not.selected',其中包含第一列中的所有4个块。然后它在这些块上迭代并调用setTimeout 4次。到目前为止还不错

然后它第一次调用处理程序。它再次计算$'.colnum1:not.selected',jQuery对象再次由所有4个块组成。它选择第一个类,因为u=0,并将所选类添加到其中

1200毫秒后,它再次调用处理程序。但这次,jQuery对象$'.colnum1:not.selected'不同。由于.selected筛选器,它不再包含第一个块。现在u=1,因此$'.colnum1:not.selected'.eq是这个新的缩短列表的第二个元素,即列中的第三个块。显然,你想要第二个

有几种方法可以解决此问题:

您可以将.eq更改为.eq0。我不太喜欢这个。 您可以将$'.colnum1:not.selected'保存到循环之前的变量中,然后在处理程序中使用该变量,而不是再次计算CSS选择器。jQuery对象将继续表示相同的4个元素,即使它们不再匹配选择器。 .each处理程序接收当前HTML元素作为参数。不是作为jQuery对象,而是作为原始DOM元素。但是,您可以通过调用$使其成为jQuery对象,然后使用新的jQuery对象。像这样: $'.colnum1'.eachfunctionu,块{ setTimeoutfunction{ $block.addClass'selected'; },1200*u; }; 或者作为前一种方法的次要变体,处理程序还通过this关键字接收DOM元素。因此,不用block参数,而是编写var block=this;就在设定超时之前。简单地用$this替换$block可能不起作用-我不确定setTimeout处理程序中的值是多少。据我所知,它甚至可能依赖于浏览器。
为什么要使用setTimeout?为什么要使用.each?@KevinB,这样就不会同时显示所有16个元素,因此它们是一个好看的flowwait,因此,您正在加载所有内容,只显示其中的一小部分,然后在用户滚动时显示更多内容,但强制他们等待动画显示它们?那是。。。。不酷。网站不使用这种功能来获得流畅的流程,而是通过不提前加载所有内容来加快初始页面加载速度。你提前加载了所有的内容,因此没有必要继续展示所有内容。我认为你只是没有很好地解释你的问题。当页面滚动到底部时,您提供的代码片段在使用ajax加载更多内容的页面上没有意义。