Failed to execute removeChild on Node

后端 未结 5 1715
盖世英雄少女心
盖世英雄少女心 2021-02-02 06:22

Other stack answers such as this and this seem to be specialized cases and I believe my case is more generalized. I am doing this in my js:

var markerDiv = docum         


        
相关标签:
5条回答
  • 2021-02-02 06:58

    Your myCoolDiv element isn't a child of the player container. It's a child of the div you created as a wrapper for it (markerDiv in the first part of the code). Which is why it fails, removeChild only removes children, not descendants.

    You'd want to remove that wrapper div, or not add it at all.

    Here's the "not adding it at all" option:

    var markerDiv = document.createElement("div");
    markerDiv.innerHTML = "<div id='MyCoolDiv' style='color: #2b0808'>123</div>";
    document.getElementById("playerContainer").appendChild(markerDiv.firstChild);
    // -------------------------------------------------------------^^^^^^^^^^^
    
    setTimeout(function(){ 
        var myCoolDiv = document.getElementById("MyCoolDiv");
        document.getElementById("playerContainer").removeChild(myCoolDiv);
    }, 1500);
    <div id="playerContainer"></div>

    Or without using the wrapper (although it's quite handy for parsing that HTML):

    var myCoolDiv = document.createElement("div");
    // Don't reall need this: myCoolDiv.id = "MyCoolDiv";
    myCoolDiv.style.color = "#2b0808";
    myCoolDiv.appendChild(
      document.createTextNode("123")
    );
    document.getElementById("playerContainer").appendChild(myCoolDiv);
    
    setTimeout(function(){ 
        // No need for this, we already have it from the above:
        // var myCoolDiv = document.getElementById("MyCoolDiv");
        document.getElementById("playerContainer").removeChild(myCoolDiv);
    }, 1500);
    <div id="playerContainer"></div>

    0 讨论(0)
  • 2021-02-02 06:59

    The direct parent of your child is markerDiv, so you should call remove from markerDiv as so:

    markerDiv.removeChild(myCoolDiv);
    

    Alternatively, you may want to remove markerNode. Since that node was appended directly to videoContainer, it can be removed with:

    document.getElementById("playerContainer").removeChild(markerDiv);
    

    Now, the easiest general way to remove a node, if you are absolutely confident that you did insert it into the DOM, is this:

    markerDiv.parentNode.removeChild(markerDiv);
    

    This works for any node (just replace markerDiv with a different node), and finds the parent of the node directly in order to call remove from it. If you are unsure if you added it, double check if the parentNode is non-null before calling removeChild.

    0 讨论(0)
  • 2021-02-02 06:59

    I was wraped it with <> </> as a parent when I changed it to normal , div , its worked fine

    0 讨论(0)
  • 2021-02-02 07:00

    As others have mentioned, myCoolDiv is a child of markerDiv not playerContainer. If you want to remove myCoolDiv but keep markerDiv for some reason you can do the following

    myCoolDiv.parentNode.removeChild(myCoolDiv);
    

    JSFiddle

    0 讨论(0)
  • 2021-02-02 07:04

    For me, a hint to wrap the troubled element in another HTML tag helped. However I also needed to add a key to that HTML tag. For example:

    // Didn't work
    <div>
         <TroubledComponent/>
    </div>
    
    // Worked
    <div key='uniqueKey'>
         <TroubledComponent/>
    </div>
    
    0 讨论(0)
提交回复
热议问题