动态地向DOM元素添加单击函数

时间:2011-07-20 13:52:41

标签: jquery

在我的测试代码中,我有一个简单的div,我将其用作5个循环创建的div元素的容器。我尝试向所有5个div元素添加一个click函数,但只给最后一个元素一个click函数。

<div id="testbed"></div>

<script type="text/javascript">
$(document).ready(function () {
    for (i = 0; i < 5; i++) {
        $("#testbed").html($("#testbed").html() + "<div id='" + i + "'>Hello!</div>");
        $("#" + i).click(function () {
            alert(i);
        });
    }
});
</script>

有趣的是,它没有警告4,而是警告5.我不知道为什么它只将click函数应用于最后一个div元素而不是第一个4.

4 个答案:

答案 0 :(得分:2)

您的所有click处理程序共享相同的i变量 由于在循环之后,i5,因此他们都说5

您需要在一个单独的函数中创建每个处理程序,该函数将i作为参数,以便每个处理程序将获得自己的i

例如:

function buildElement(i) {
    $("#testbed").html($("#testbed").html() + "<div id='" + i + "'>Hello!</div>");
    $("#" + i).click(function () {
        alert(i);
    });
}


for (i = 0; i < 5; i++) {
    buildElement(i);
}

答案 1 :(得分:0)

您也可以采取相应的措施:

$.each([1, 2, 3, 4, 5], function(index, value) { 
     $("#testbed").append("<div id='" + index + "'>Hello!</div>");
     $("#" + index).click(function () {
         alert(index);
     });
 });

答案 2 :(得分:0)

以下称为javascript闭包。在绑定时,您运行匿名函数,该函数返回在触发事件时执行alert(i)的另一个函数。第一个匿名函数“wrapps”为i创建另一个级别的变量作用域,因此当原始i稍后递增时,匿名函数内的i保持不变。漂亮的小技巧。

<div id="testbed"></div>

<script type="text/javascript">
$(document).ready(function () {
    for (i = 0; i < 5; i++) {
        $("#testbed").html($("#testbed").html() + "<div id='" + i + "'>Hello!</div>");
        $("#" + i).click(function (i) {
            return function(evt) {
                // inside here, you have access to the event object too
                alert(i);
            };
        }(i));
    }
});
</script>

javascript closures

的更多信息

顺便说一下,如果你想将点击事件添加到所有div,你不能用.html()替换它们  在每个循环中,使用.append()代替,如下所示:

<div id="testbed"></div>

<script type="text/javascript">
$(document).ready(function () {
    for (i = 0; i < 5; i++) {
        $("#testbed").append("<div id='" + i + "'>Hello!</div>");
        $("#" + i).click(function (i) {
            return function(evt) {
                // inside here, you have access to the event object too
                alert(i);
            };
        }(i));
    }
});
</script>

答案 3 :(得分:0)

您需要将click事件添加到对象。

    $(function(){

      $('#testbed').empty();       

     for (i = 0; i < 5; i++) {
          $('<div />').text('Hello').attr('id', i).click(function(){
              alert($(this).attr('id'));
          }).appendTo('#testbed');
       }

    });