JavaScript的循环只适用于每个其它元件(javascript loop only apply

2019-08-08 15:28发布

我有以下后,我完成一个ajax查询下面的JavaScript

我所有的图像都NAME =“PIC”

<script type="text/javascript">
 function done() {
     var e = document.getElementsByName("pic");
     alert(e.length);
     for (var i = 0; i < e.length; i++) {
         cvi_instant.add(e[i], { shadow: 75, shade: 10 });
     }
 }

我的目标是围绕申请使用这个库的图像边界:

http://www.netzgesta.de/instant/

问题是,由于某种原因,这个工作,但它似乎只适用于每一个其他的图片,而不是每个人。 任何线索,为什么上面的代码将跳过所有其他元素?

编辑:我加在循环警报,它并正确地去0,1,2,3,4,5,6。

     for (var i = 0; i < e.length; i++)
     {
         alert(i);
         cvi_instant.add(e[i], { shadow: 75, shade: 10 });
     }

Answer 1:

它似乎只适用于每一个其他的图片,而不是每个人的

这是破坏性的迭代的经典标志。

试想,如果,因为我猜,功能会发生什么cvi_instant.add替换指定的元素pic与其他一些要素或元素。

getElementsByName返回一个“活”的节点列表:这是每一个你做出改变的DOM时间保持最新。 所以,如果它之前五行了,你的电话后cvi_instant.add现在只有四个包含:第一点是过去了,节点1-4已经向下移动到位置0-3。

现在,你周围的循环去一次。 i++ ,所以我们看到的元素,但1件1现在是什么最初元素2! 我们跳过了原始元素1,我们将继续跳过所有其他元素,直到我们达到(现在的一半长)列表的末尾。

同时作为迭代改变它的列表会导致这样那样的问题。 如果迭代里面的过程实际添加元素到列表中,你甚至可以得到一个无限循环!

速战速决是向后迭代循环。 现在你做的最后一个元素首先,让所有其他元素在原位置,并没有造成跳绳:

 var e= document.getElementsByName("pic");
 for (var i= e.length; i-->0;) {
     cvi_instant.add(e[i], { shadow: 75, shade: 10 });
 }

另一种简单的解决方案,如果你知道你总是会被从列表中删除的元素在每次调用是:

 var e= document.getElementsByName("pic");
 while (e.length>0) {
     cvi_instant.add(e[0], { shadow: 75, shade: 10 });
 }

当你的循环体可以做任何事情的清单,如插入新元素命名为最需要通用的解决方案pic在文档的开始或去除中间的其他元素。 这是稍微慢一些,但始终安全做出的排行榜,从工作的静态副本:

 function Array_fromList(l) {
     var a= [];
     for (var i= 0; i<l.length; i++)
         a.push(l[i]);
     return a;
 }

 var e= Array_fromList(document.getElementsByName("pic"));
 for (var i= 0; i<e.length; i++) {
     cvi_instant.add(e[i], { shadow: 75, shade: 10 });
 }


Answer 2:

我的猜测是,cvi_instant.add()是做传递给它的值有一些递增或迭代。 尽量不要做这一点 - 它更容易,而且我相信它会解决您的问题:

function done() {
  var e = document.getElementsByName('pic');
  for (pic in e) { cvs_instant.add(pic, { shadow: 75, shade: 10 }); }
}


Answer 3:

您好我遇到了同样的问题。 我的剧本是跳过所有其他元素。 我终于通过简单地从我改变变量名在我环路到k解决了这个问题。 我的猜测是为此,我所使用的getElementsByTagName内部跟踪它被设置在实时节点列表,并以某种方式泄露给程序员接口变量。 因此,它的一个错误! :-)



Answer 4:

- 编辑:

所有我下面的要求似乎是完全错误的 。 我这里离开这个作为一个点的人谁认为我在FF3测试相同的:)。 我很想要求,我看到这种行为一次,在IE浏览器,但也许很多年前(来想想看,它可能是7年前)。 我的记忆可能是不好的:)

- OLD:

略微膨胀在我的胡乱猜测,如果事实证明是准确的:

从内存,如果你不声明一个变量(“VAR ...”),它会使用一个从别的地方。

因此,如果没有测试,这段代码:

for(var k = 0; k < 2; k++){
    f();
    alert("k: " + k);
}

function f () {
  k++;
}

应该表现出相同的行为。 我认为TML的解决方案是相当不错的,从一个“防御性编码”一点,我的分析结果是正确的。



文章来源: javascript loop only applying to every other element