如何在javascript中使用委托

时间:2017-05-24 01:06:16

标签: javascript delegates

我尝试用javascript制作待办事项列表应用程序,我有创建新项目(li元素)的功能

  todoView: function (todo) {
    var controller =  todoController.todoList;
    console.log('controller', controller);

    var item = document.createElement('li');
    item.setAttribute('class', 'todoItem');

    var inpCheckbox = document.createElement('input');
    this.setAttributes(inpCheckbox, { 'type': 'checkbox', 'class' : 'itemList'} );

    var lbContent = document.createElement('label');
    lbContent.innerHTML = todo.getContent();

    var btnRemove = document.createElement('button');
    console.log('id', this.id)
    this.setAttributes(btnRemove, { 'class': 'remove', 'id' : this.id} );
    // btnRemove.setAttribute('id', this.id);

    //item append each element
    item.appendChild(inpCheckbox);
    item.appendChild(lbContent);
    item.appendChild(btnRemove);

    console.log('item', item);

    //ul append each item
    document.querySelector('#todoListView').appendChild(item);
  },

但是在结束文件中,我为所有li项设置了句柄事件,其中包含类.remove

var deleteItem = document.getElementsByClassName('remove')
for(var i = 0; i < deleteItem.length; i++) {
  deleteItem[i].addEventListener("click", function() {
    todoController.removeTodo(i);
  });
}

但现在我遇到了无法调用.remove类的问题,因为它只是创建了todoView函数。它包含差异块。在jquery中我可以使用委托来解决它,但我不知道如何在js对中修复它。请帮助我

1 个答案:

答案 0 :(得分:0)

而不是

var deleteItem = document.getElementsByClassName('remove')
for(var i = 0; i < deleteItem.length; i++) {
  deleteItem[i].addEventListener("click", function() {
    todoController.removeTodo(i);
  });
}

你想要

todoListView.addEventListener('click', function(e) {
   if(e.target.classList.contains('remove')){
     todoController.removeTodo(e.target);
   } 
});

但是,我认为您的removeTodo功能存在缺陷