我有以下后,我完成一个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 });
}
它似乎只适用于每一个其他的图片,而不是每个人的
这是破坏性的迭代的经典标志。
试想,如果,因为我猜,功能会发生什么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 });
}
我的猜测是,cvi_instant.add()是做传递给它的值有一些递增或迭代。 尽量不要做这一点 - 它更容易,而且我相信它会解决您的问题:
function done() {
var e = document.getElementsByName('pic');
for (pic in e) { cvs_instant.add(pic, { shadow: 75, shade: 10 }); }
}
您好我遇到了同样的问题。 我的剧本是跳过所有其他元素。 我终于通过简单地从我改变变量名在我环路到k解决了这个问题。 我的猜测是为此,我所使用的getElementsByTagName内部跟踪它被设置在实时节点列表,并以某种方式泄露给程序员接口变量。 因此,它的一个错误! :-)
- 编辑:
所有我下面的要求似乎是完全错误的 。 我这里离开这个作为一个点的人谁认为我在FF3测试相同的:)。 我很想要求,我看到这种行为一次,在IE浏览器,但也许很多年前(来想想看,它可能是7年前)。 我的记忆可能是不好的:)
- OLD:
略微膨胀在我的胡乱猜测,如果事实证明是准确的:
从内存,如果你不声明一个变量(“VAR ...”),它会使用一个从别的地方。
因此,如果没有测试,这段代码:
for(var k = 0; k < 2; k++){
f();
alert("k: " + k);
}
function f () {
k++;
}
应该表现出相同的行为。 我认为TML的解决方案是相当不错的,从一个“防御性编码”一点,我的分析结果是正确的。