我有一个创建HTML表的函数:

makeHTMLTable: function(array){
    var table = document.createElement('table');
      for (var i = 0; i < array.length; i++) {
        var row = document.createElement('tr');
        var cell = document.createElement('td');
        cell.textContent = array[i];
        row.appendChild(cell);
        cell = document.createElement('td');
        var msgButton = document.createElement('button');
        msgButton.setAttribute("id", "msgButton" +i);
        msgButton.textContent = "message";
        msgButton.addEventListener("click", this.messageUser, false);
        cell.appendChild(msgButton)
        row.appendChild(cell);
        table.appendChild(row);
      }
      return table;
  },


然后我有这个功能:

messageUser: function(){
    debugger;
    this.parentNode.parentNode.remove();
    unMatch();
  },


当我单击msgbutton时,我希望它会删除整个行,包括按钮本身和返回的少量文本。
即:

hello [msgbutton]

goodbye [msgbutton]

如果我在问候行中单击[msgbutton],它将如下所示:

goodbye [msgbutton]

但是到目前为止:this.parentNode.parentNode.remove();返回未定义。

编辑:

我在较早的承诺中称呼this.retrieveMatches()
this.fetchMatches()返回一个数组

  retrieveMatches: function(){
    var tableResult = this.makeHTMLMatchesTable(this.fetchMatches(object));
    var matches = document.getElementById('matches')
    matches.parentNode.insertBefore(tableResult, matches);
  },

最佳答案

您正在尝试调用包含“ messageUser”功能而不是HTML元素的对象。
例如:

var obj = {
    notify: function(msg){
        alert(msg);
    },
    messageUser: function(){
        this.notify("some message"); //This line will call obj.notify()
        this.parentNode.parentNode.remove(); //obj is not a HTML element, therefore it will create an error
    }
}


由于要在循环中添加事件侦听器,因此需要创建一个绑定事件侦听器的函数。

function bindEvent(button){
    button.addEventListener("click", function(){
        this.parentNode.parentNode.remove(); //"this" refer to the "button" object
    }, false);
}


您可以将函数放在上面,然后再返回对象“表”

关于javascript - 无法读取未定义的属性`parentNode`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40339228/

10-11 20:05