javascript - 原型(prototype)添加事件监听器

标签 javascript events loops prototypejs

出于某种原因,当我尝试将 actionlisetner 分配给列表元素时,该值不固定。这就是我的意思:

Event.observe(window, 'load', function() {
    for(i = 1; i <= $$('ul#review_list li').length; i++) {
        $('cover_' + i).observe('click', function(event) {
            alert(i);
        }); 
    }

});

#review_list 中有 7 个列表元素,出于某种原因,每当单击任何 li 元素时,我都会收到一个警报,每个元素被单击时的值为 8。我希望每个人都提醒其各自的 i 值。我在这里做错了什么?

谢谢!

最佳答案

试试这个:

Event.observe(window, 'load', function() {
    for(i = 1; i <= $$('ul#review_list li').length; i++) {

        (function (i) { // i is passed as an argument below

            $('cover_' + i).observe('click', function(event) {
                alert(i); // creates a closure around the argument i
            });

        })(i); // pass i as an argument

    }
});

第一种方法不行的原因是因为alert(i);在循环变量 i 周围创建一个闭包,它会随着每个事件分配而递增。在第一个事件被触发时,i 的值是 8,这对所有事件都是通用的,这就是为什么无论你点击哪里都会得到 8。

在第二种方法中,我发布的那个,alert(i) 创建了一个围绕参数 i 的闭包,它不会与任何其他事件监听器共享.

无论如何,你应该阅读this article on JavaScript closures以便更好地理解它们。

关于javascript - 原型(prototype)添加事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1284212/

相关文章:

C++ Win 异步套接字。是否可以中断 select()

PHP foreach 循环 - 需要与显示的文本不同的值

python - while循环测试

javascript - 如何使用 JavaScript 在 ASP.net 中显示动态内容

javascript - 具有 WebView 和 native View 的混合应用程序的优缺点是什么?

javascript - ECMAScript 规范中的 `ExpressionNoIn` 是什么意思?

javascript - 为什么我的获取对象属性值的循环不起作用?

javascript - 相当于 SQL 完全连接与 Javascript 对象数组

c# - 在 WPF Threestate Checkbox 中捕获不确定状态

javascript - React Native - 可触摸和胜利图表