【问题标题】:How to use delegate in javascript如何在javascript中使用委托
【发布时间】:2017-05-24 01:06:16
【问题描述】:

我尝试使用 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 对中修复它。请帮助我

【问题讨论】:

    标签: javascript delegates


    【解决方案1】:

    代替

    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 函数存在缺陷

    【讨论】:

    • 您的解释太清楚了,但是对于您显示的代码演示,它不适用于我的实践。你能再帮我检查一下吗。让我们看看codepen.io/dienvm/pen/jmdmKY的代码,谢谢@JaromandaX
    • 抱歉,我还是不清楚,在找到.remove 类的元素之前,我会创建新按钮,对吧?就像那样 ` var btnRemove = document.createElement('button') var deleteItem = document.getElementsByClassName('remove'); Array.prototype.forEach.call(deleteItem, function(item, i) { item.addEventListener("click", function() { todoController.removeTodo(i); }); }); `
    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 2012-08-27
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多