This post is exactly about this problem: Manipulating innerHTML removes events – Friendly Bit. The key point here is that the String type is immutable:
Obviously, events on an element cannot be retained if the element is replaced by a completely different string using innerHTML. You basically throw away that part of the DOM and write it new.
Adding using the unary + (“+=”) is just a “shorthand” for reading, adding, and reassigning values.
Modifying innerHTML causes the content to be re-parsed and DOM nodes to be recreated, losing the handlers you have attached.
A very good alternative seems the Element.insertAdjacentHTML() method.