Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 添加单击侦听器以列出循环中的项目_Javascript_Html_Javascript Events - Fatal编程技术网

Javascript 添加单击侦听器以列出循环中的项目

Javascript 添加单击侦听器以列出循环中的项目,javascript,html,javascript-events,Javascript,Html,Javascript Events,我有以下代码: // Iterate through each of the children for(j = 0; j < len; j++) { var entry = sortedArray[j]; // Each entryLI is a child of nameOL <ol> element var entryLI = document.createElement("li"); /

我有以下代码:

    // Iterate through each of the children
    for(j = 0; j < len; j++) {
        var entry = sortedArray[j];

        // Each entryLI is a child of nameOL <ol> element
        var entryLI = document.createElement("li"); 

        // Each entryLI should have a unique click listener
        entryLI.addEventListener("click", function(event) {entry.onListItemClick()});

        // Set the text of the <li> to the name of the entry
        var nameNode = document.createTextNode(entry.entryName);
        entryLI.appendChild(nameNode);

        // Append the entry list item to the ordered list
        nameOL.appendChild(entryLI); 
    }
在这个循环中,我试图为每个列表项提供一个处理单击事件的事件侦听器。但是,由于某些原因,单击任何列表项都会调用列表中最后一项的事件侦听器

有人能解释一下为什么会这样吗

我是从完全不同的语言开始学习JavaScript的,我正在努力学习基于原型的类

条目变量在每个循环中都会被覆盖。避免这种情况的一种方法是:

for(j = 0; j < len; j++) {

    (function(entry){

       ....

    })(sortedArray[j])

}
此IIF立即调用的函数为每个迭代分别确定入口变量的作用域。

入口变量在每个循环中都会被覆盖。避免这种情况的一种方法是:

for(j = 0; j < len; j++) {

    (function(entry){

       ....

    })(sortedArray[j])

}

这个IIF立即调用的函数为每次迭代分别定义入口变量的作用域。

这是因为下面的一行

entryLI.addEventListener("click", function(event) {entry.onListItemClick()});
限制为变量项,而不是其值。所以,无论在整个循环中分配了什么或值发生了变化,最后一次迭代的值都保存在entry变量中,每个事件处理程序函数都将访问该变量并获取最后一个值


解决方案:按照Kenney在这个Q线程中的建议使用,或者检查它是否不那么模棱两可。

这是因为下面的一行

entryLI.addEventListener("click", function(event) {entry.onListItemClick()});
限制为变量项,而不是其值。所以,无论在整个循环中分配了什么或值发生了变化,最后一次迭代的值都保存在entry变量中,每个事件处理程序函数都将访问该变量并获取最后一个值


解决方案:按照Kenney在这个Q线程中的建议使用,或者检查它是否不那么模棱两可。

是的,你是对的,我没有看到任何包含列表的数组。是的,你是对的,我没有看到任何包含列表的数组。这很有效!我不知道IIF是怎么工作的;这件事我下次再去调查,正式名称是“生活”,我忘了E.See。大多数JavaScript库都使用它。它归结为声明一个函数并立即调用它;这是函数foo{}的简短语法;福,成功了!我不知道IIF是怎么工作的;这件事我下次再去调查,正式名称是“生活”,我忘了E.See。大多数JavaScript库都使用它。它归结为声明一个函数并立即调用它;这是函数foo{}的简短语法;福。