在for循环中绑定单击事件

时间:2013-09-23 10:15:10

标签: javascript jquery html

我在for循环中创建了一个无序列表和一个按钮。我想在同一个for循环中绑定按钮的单击功能。

尝试使用连接选项。它不起作用。

function displayFeeds(items){
    var ul = $('#listview');
    for (var i = 0; i < items.length; i++) {
         var li = $('<li/>').html(items[i].DeviceNames);
         li.append($('<li/>').html(items[i].DeviceQuantity));
         li .append('<input type="button" value="Add" id="'+i+'">');
         // Enhance new button element
        li.append($('<hr>')); 
         ul.append(li); 


    $('#"+i+"').bind('click', function () {             
        console.log("called");
        var clickedID = this.id;
        console.log(clickedID);
        UpdateDeviceDetails(clickedID);             
    });
    }
}  

我该怎么办?

2 个答案:

答案 0 :(得分:1)

尝试更改

$('#"+i+"').bind('click', function () {

$('#'+i).bind('click', function () {

答案 1 :(得分:1)

除了停止当前代码工作的语法错误之外,在循环中追加x个点击处理程序的速度相对较慢。更好的解决方案是将委托事件附加到单个共享父元素。试试这个:

function displayFeeds(items){
    var ul = $('#listview');
    for (var i = 0; i < items.length; i++) {
        var li = $('<li/>').html(items[i].DeviceNames);
        li.append($('<li/>').html(items[i].DeviceQuantity));
        li.append('<input type="button" value="Add" class="add-input" />');
        li.append($('<hr>')); 
        ul.append(li); 
    }
}

// single event handler...
$('#listview').on('click', '.add-input', function() {
    UpdateDeviceDetails(this.id);             
});

你甚至可以通过将UpdateDevideDetails的引用传递给click处理程序来简化它,如下所示:

$('#listview').on('click', '.add-input', UpdateDeviceDetails);

var UpdateDeviceDetails = function(el) {
    var id = el.id;
    // rest of your logic...
}

另请注意,jQuery生成的HTML无效 - 您不能将li作为另一个li元素的直接子项。所有li元素都应包含父ulol