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
    ,请参见我的编辑