addEventListener创建了一个无限循环
addEventListener Created an Infinite Loop
我添加了一个事件侦听器,它创建了一个无限循环,我真的不明白我做错了什么。
发生的事情是它自己不断点击图像
这是我的代码:
function attachOnClickEvent(cases,theme,debut,capture){
var images=document.getElementsByTagName('img');
for(var i=0;i<images.length;i++){
images[i].addEventListener("click",x(cases,theme,debut,capture),false);
}
};
var x=function(cases,theme,debut,capture){newImage(this,cases,theme,debut,capture);};
function newImage(elem,cases,theme,debut,capture){
var images=preloadImages(cases,theme);
var imgTab=document.getElementsByTagName('img');
var Id=elem.id;
elem.src=images[randomTab[Id]];
};
希望有人能发现我的错误。。谢谢
getElementsByTagName
正在返回实时NodeList- 您每次调用函数
x
,而不是将其添加为处理程序 - 创建新的
<img>
-
NodeList的长度增加了
1
- 下一次迭代与上一次迭代离终点的距离相同
有两件事你需要考虑,首先,正如我在2
中提到的,你在无意的时候调用x
。其次,你可以通过向下循环来避免实时列表的一些问题
获得所需结果的一个修复方法可能是像这个一样重写attachOnClickEvent
function attachOnClickEvent(cases, theme, debut, capture) {
var images = document.getElementsByTagName('img'),
handler = function (e) {
return x(cases, theme, debut, capture);
},
i;
for (i = images.length - 1; i >= 0; --i) {
images[i].addEventListener("click", handler, false);
}
}
一个问题似乎是您没有正确使用回调。
回调必须是函数对象,并且不能按预期返回。
function (cases, theme, debut, capture) {
return function() { newImage(this, cases, theme, debut, capture); };
}
请尝试返回一个匿名函数。
最好看看你是如何调用这些函数的,但我注意到这一行:
images[i].addEventListener("click",x(cases,theme,debut,capture),false);
您正在调用函数x
,而不是将其指定为事件侦听器。由于该函数向页面添加了一个图像,因此循环永远不会完成,因为它会遍历页面上的所有图像。这行应该是:
images[i].addEventListener("click", x , false );
相关文章:
- 为什么我使用javascript获得了一个无限的for循环
- javascript停止一个无限循环
- setTimeout 会创建一个无限循环
- 为什么我有一个无限循环
- 为什么(;;){…}是一个无限循环
- 为什么“;window=window.parent"创建一个无限循环
- 把我的折线放在一个无限循环中
- 为什么这个树的布局给了我一个无限的循环
- JavaScript:为什么这会导致一个无限循环
- 两个同步事件创建了一个无限循环
- 为什么我的javascript代码会进入一个无限循环
- 为什么这会导致一个无限循环
- 在一个无限循环风格的展示中预先加载相邻的条目
- addEventListener创建了一个无限循环
- 在Jquery中创建一个无限循环
- 为什么这段代码创建了一个无限循环?
- Select2 trigger("change")创建一个无限循环
- 为什么这会产生一个无限循环
- 是否有任何解决方案来结束一个无限循环函数
- 为什么我的角脚本运行一个无限循环