2017-09-27 103 views
0

EDIT 2(使问题更容易理解)获得前一个元素在循环

我想达到的效果是:每次一个元素进入检视一个“是可见的”类添加到它和相同的'可见'类是从前一个元素中删除。

现在我已经设法使其工作,但我运行for循环删除所有is-visible类,然后将is-visible类添加到视口中的元素。

它的工作原理,但在性能方面,我认为最好从element[i -1]中删除该类。而这是我无法得到它的工作。

这里是一个简化小提琴,我试图使element[i-1]解决方案工作:https://jsfiddle.net/epigeyre/vm36fpuo/11/


EDIT 1(回答一些问题)

我以一个模运算修正通过@Catalin扬库(非常感谢您提出的宝贵帮助)提出的一个问题((i+len-1)%len )。


原来的问题(真不明白)

我想用下面的代码来获取前一个元素在for环(改变其类):

for (var i = 0; i < array.length; i++) { 
    if(array[i-1] && my other conditions) { 
     array[i-1].classList.remove('is-visible'); 
     array[i].classList.add('is-visible'); 
    } 
} 

但它不会删除[i-1]元素的类。

这里是我的模块的代码更完整的一块(这是一个scroll事件侦听内运行):

var services = document.getElementsByClassName('services'), 
    contRect = servicesContainer.getBoundingClientRect(); 

for (var i = 0; i < services.length; i++) { 
    var serviceRect = services[i].getBoundingClientRect(); 

    if (!services[i].classList.contains('active') && Math.round(serviceRect.left) < contRect.right && services[i-1]) { 
     services[i-1].classList.remove('is-visible'); 
     services[i].classList.add('is-visible'); 
    } 
} 

感谢您的帮助!

+2

嗯,不,它只会得到前一个。但由于它在for循环中,所以每次迭代都会得到前一个循环。 – stybl

+0

这句话没有任何意义'但是看起来[i-1]正在获取所有以前的元素,而不是前一个元素。“ - 这确实只能读取数组中的前一个实例。 PLease提供一个[mcve]来演示你确切的问题。 – Jamiec

+0

在第一次迭代中,我是0 ...因此,您得到的所有元素可能是因为您引用了0-1 = -1数组元素...或者您需要为此获取错误。 – golddragon007

回答

1

您的if(array[i-1] && my other conditions)总是如此,除非第一种情况array[-1]不存在。因此,它将删除并为每个元素添加active类,这将使得看起来只有第一个元素的类已被删除。

你需要的是一个更好的if条件或break声明,当不再

for (var i = 0; i < array.length; i++) { 
    if(array[i] && i != array.length - 1) { 
     array[i].classList.remove('active'); 
    } 
} 
array[array.length - 1].classList.add('active'); 
+0

所以这意味着'if(array [i-1])'不足以防止这种情况发生? – Pipo

+0

是的,因为'if(variable)'只验证该变量是否与undefined或其他等价值不同,比如0,“”等。由于您的元素存在,它将始终验证为真。 –

+0

不,因为你的数组元素是DOM对象,其类是'services'。它们不会评估为简单的值,如0或-1。我已经编辑了我的答案,以包含一个更可能的解决方案,正是你想要的。 –

0

需要循环中的问题可能是,根据您的代码:services[i-1].classList.remove('active');services[i].classList.add('active');“活动”类,你在当前迭代中添加将在下一次迭代中被删除!

所以你的代码有逻辑错误,数组索引不返回所有的prev项目!

+0

是的,但这就是我想要的,每当满足条件时,前一个活动类都必须移除。我不是这样想的吗? – Pipo

0

如果您创建一个包含前一个元素的变量,该怎么办?

var previous = array[0]; 
for (var i = 0; i < array.length; i++) { 
    if(previous && my other conditions) { 
     previous.classList.remove('active'); 
     array[i].classList.add('active'); 
    break; 
    } 
    previous = array[i]; 
} 
+0

我也试过了......如果你想看看,我已经发布了一个jsfiddle的问题:) – Pipo

相关问题