Is it possible to append to innerHTML without destroying descendants' event listeners?

前端 未结 13 1160
悲哀的现实
悲哀的现实 2020-11-21 23:40

In the following example code, I attach an onclick event handler to the span containing the text \"foo\". The handler is an anonymous function that pops up an <

相关标签:
13条回答
  • 2020-11-22 00:22

    The easiest way is to use an array and push elements into it and then insert the array subsequent values into the array dynamically. Here is my code:

    var namesArray = [];
    
    function myclick(){
        var readhere = prompt ("Insert value");
        namesArray.push(readhere);
        document.getElementById('demo').innerHTML= namesArray;
    }
    
    0 讨论(0)
  • 2020-11-22 00:24

    Yes it is possible if you bind events using tag attribute onclick="sayHi()" directly in template similar like your <body onload="start()"> - this approach similar to frameworks angular/vue/react/etc. You can also use <template> to operate on 'dynamic' html like here. It is not strict unobtrusive js however it is acceptable for small projects

    function start() {
      mydiv.innerHTML += "bar";
    }
    
    function sayHi() {
      alert("hi");
    }
    <body onload="start()">
      <div id="mydiv" style="border: solid red 2px">
        <span id="myspan" onclick="sayHi()">foo</span>
      </div>
    </body>

    0 讨论(0)
  • 2020-11-22 00:24

    Losing event handlers is, IMO, a bug in the way Javascript handles the DOM. To avoid this behavior, you can add the following:

    function start () {
      myspan = document.getElementById("myspan");
      myspan.onclick = function() { alert ("hi"); };
    
      mydiv = document.getElementById("mydiv");
      clickHandler = mydiv.onclick;  // add
      mydiv.innerHTML += "bar";
      mydiv.onclick = clickHandler;  // add
    }
    
    0 讨论(0)
  • 2020-11-22 00:27

    Using .insertAdjacentHTML() preserves event listeners, and is supported by all major browsers. It's a simple one-line replacement for .innerHTML.

    var html_to_insert = "<p>New paragraph</p>";
    
    // with .innerHTML, destroys event listeners
    document.getElementById('mydiv').innerHTML += html_to_insert;
    
    // with .insertAdjacentHTML, preserves event listeners
    document.getElementById('mydiv').insertAdjacentHTML('beforeend', html_to_insert);
    

    The 'beforeend' argument specifies where in the element to insert the HTML content. Options are 'beforebegin', 'afterbegin', 'beforeend', and 'afterend'. Their corresponding locations are:

    <!-- beforebegin -->
    <div id="mydiv">
      <!-- afterbegin -->
      <p>Existing content in #mydiv</p>
      <!-- beforeend -->
    </div>
    <!-- afterend -->
    
    0 讨论(0)
  • 2020-11-22 00:29

    As a slight (but related) asside, if you use a javascript library such as jquery (v1.3) to do your dom manipulation you can make use of live events whereby you set up a handler like:

     $("#myspan").live("click", function(){
      alert('hi');
    });
    

    and it will be applied to that selector at all times during any kind of jquery manipulation. For live events see: docs.jquery.com/events/live for jquery manipulation see: docs.jquery.com/manipulation

    0 讨论(0)
  • 2020-11-22 00:29

    You could do it like this:

    var anchors = document.getElementsByTagName('a'); 
    var index_a = 0;
    var uls = document.getElementsByTagName('UL'); 
    window.onload=function()          {alert(anchors.length);};
    for(var i=0 ; i<uls.length;  i++)
    {
        lis = uls[i].getElementsByTagName('LI');
        for(var j=0 ;j<lis.length;j++)
        {
            var first = lis[j].innerHTML; 
            string = "<img src=\"http://g.etfv.co/" +  anchors[index_a++] + 
                "\"  width=\"32\" 
            height=\"32\" />   " + first;
            lis[j].innerHTML = string;
        }
    }
    
    0 讨论(0)
提交回复
热议问题