Search code examples
javascriptaddeventlistenerprototype-programming

How to add event listener to element created dynamically within prototype?


HTML

<div id="main"></div>

JS

var TestClass = function() {};
TestClass.prototype = {
    addElement: function(parentId) {
    var parent = document.querySelector('#' + parentId);
    var a = document.createElement('a');
    a.textContent = '+';
    a.href = '#';
    a.addEventListener('click', this.onElementClick, false); //nothing happens on click
    parent.innerHTML = a.outerHTML;
  },

  onElementClick: function() {
    console.log('dynamic element clicked');
  }
};

new TestClass().addElement('main'); // on DOM ready

Output

<div id="main"><a href="#">+</a></div>

Solution

  • Like this:

    var TestClass = function() {};
    TestClass.prototype = {
        addElement: function(parentId) {
        var parent = document.getElementById(parentId); //Changed to getElementById
        var a = document.createElement('a');
        a.textContent = '+';
        a.href = '#';
        a.addEventListener('click', this.onElementClick, false);
        parent.append(a); //Changed
      },
    
      onElementClick: function() {
        console.log('dynamic element clicked');
      }
    };
    
    new TestClass().addElement('main'); // on DOM ready
    <div id="main"></div>

    You did not add your a to parent, instead you just added its HTML.