代码之家  ›  专栏  ›  技术社区  ›  Matt Gibson

附加多个新元素并为每个新元素注册一个click事件的标准方法(jQuery初学者!)

  •  1
  • Matt Gibson  · 技术社区  · 15 年前

    我是jQuery初学者。我正在向一个div中添加一组新图像。我希望这些图像中的每一个都对单击作出响应。

    在事后看来,我最初的愚蠢代码是这样的:

    for (var i = 0; i < 10; i++) {
        $("div#stargrid").append("<img class='clickme' src='http://placehold.it/90x90' alt='90x90 placeholder image' />").click(my_event_handler);
    }
    

    现在,我发现这很愚蠢,因为链接并不像我想象的那样工作,所以(我认为)这实际上将click事件处理程序添加了十次到我的 div#stargrid img .

    我找到了一个似乎适合我的解决方案,就是将这些操作分离出来,然后将click事件绑定到所有的图像上:

    for (var i = 0; i < 3; i++) {
        $("div#stargrid").append("<img class='clickme' src='http://placehold.it/90x90' alt='90x90 placeholder image' />");
    }
    $(".clickme").click(imageclick);
    

    我的问题是:这样做“对”吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   jAndy    15 年前

    “正确”的方法(这是可行的,但是你应该很快忘记它)

    for (var i = 0; i < 10; i++) {
        $("div#stargrid").append($("<img class='clickme' src='http://placehold.it/90x90' alt='90x90 placeholder image' />").click(my_event_handler));
    }
    

    如你所见,我刚刚给 jQuery constructor 功能 $()

    但这有点难看,更好的方法是

    $('<img/>', {
       'class':   'clickme',
       'src':     'http://placehold.it/90x90',
       'alt':     '90x90 placeholder image',
       'click':   function(){
           alert('CLICKED');
       }
    }).appendTo($("div#stargrid"));
    

    event delegation n .

    在这种情况下

    $("div#stargrid").delegate('.clickme', 'click', function(e){
        alert('CLICKED');
    });
    

    event object e 它被传递到处理程序以区分实际单击了哪个元素,例如,检查一个id值。

        2
  •  0
  •   abespalov    15 年前