Javascript addEventListener创建了一个无限循环
我添加了一个事件监听器,它创建了一个无限循环,我真的不知道我做错了什么 结果是它自己不断点击图像 这是我的密码:Javascript addEventListener创建了一个无限循环,javascript,html,addeventlistener,Javascript,Html,Addeventlistener,我添加了一个事件监听器,它创建了一个无限循环,我真的不知道我做错了什么 结果是它自己不断点击图像 这是我的密码: function attachOnClickEvent(cases,theme,debut,capture){ var images=document.getElementsByTagName('img'); for(var i=0;i<images.length;i++){ images[i].addEventListener("click",
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]];
};
函数附件(案例、主题、首次亮相、捕获){
var images=document.getElementsByTagName('img');
对于(var i=0;i来说,一个问题似乎是您没有正确地使用回调
回调需要是函数对象,不能按预期返回
function (cases, theme, debut, capture) {
return function() { newImage(this, cases, theme, debut, capture); };
}
尝试返回一个匿名函数
getElementsByTagName
正在返回一个活动节点列表
每次都调用函数x
,而不是将其作为处理程序添加
将创建一个新的
节点列表的长度增加了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);
}
}
最好看看您是如何调用这些函数的,但我注意到在这一行:
images[i].addEventListener("click",x(cases,theme,debut,capture),false);
您正在调用函数x
,而不是将其指定为事件侦听器。由于该函数将图像添加到页面中,因此循环永远不会完成,因为它会遍历页面上的所有图像。此行应改为:
images[i].addEventListener("click", x , false );
我在这里看到了3个函数声明,但没有对函数的调用。你能发布一个更完整的代码示例吗?具体来说,请发布你的HTML并显示你的事件绑定。更好的是,制作一个JSFIDDLEY当我返回一个匿名函数时它可以工作,但是我需要删除其中一些事件,所以我不能只使用匿名函数选项…然后将您的参数附加到图像元素,您可以使用this
再次访问它们。我不太确定如何访问它们。您能给我一个例子吗?我应该做什么来添加x作为处理程序?此外,图像是在使用另一个函数之前创建的,因为您试图通过传递参数,您需要在它们上面创建一个新的闭包(即一个函数),它包装x
,请参见我的编辑