Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

231
Vistas
Why Insert before first child not working

If the element has children insert a new div "i-new-element". parent2 and parent3 get a new div.

child3-parent3 has children but doesn't get a new giant. Why?

How can I make it possible for children who have children to get a new div?

it should look like:

<div id="child3-parent3">
  <div id="i-new-element"></div>
  <div id="child3"></div>
  <div id="child4"></div>
</div>

var container = document.getElementById("container").querySelectorAll("#container > *");

container.forEach(function(div) {
  {
    if (div.hasChildNodes()) {
      let parentElement = div;
      let theFirstChild = parentElement.firstChild;
      let newElement = document.createElement("div")
      newElement.id = "i-new-eleemnt"
      parentElement.insertBefore(newElement, theFirstChild)
    }
  }
});
<div id="container">
  <div id="parent1"></div>
  <div id="parent2">
    <div id="child1"></div>
    <div id="child2"></div>
    <div id="child3-parent3">
      <div id="child3"></div>
      <div id="child4"></div>
    </div>
  </div>
  <div id="parent3">
    <div id="child5"></div>
    <div id="child6"></div>
  </div>
</div>

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Using

var container = document.getElementById("container");
var elements = container.querySelectorAll(":scope *");

instead of

var container = document.getElementById("container").querySelectorAll("#container > *");

should fix your problem.

var container = document.getElementById("container");
   var elements = container.querySelectorAll(":scope *");

elements.forEach(function(div){
  {
    if (div.hasChildNodes()) {
      let parentElement = div;
      let theFirstChild = parentElement.firstChild;
      let newElement = document.createElement("div")
      newElement.id = "i-new-eleemnt"
      parentElement.insertBefore(newElement, theFirstChild)
    }
  }
});
<div id="container">
  <div id="parent1"></div>
  <div id="parent2">
    <div id="child1"></div>
    <div id="child2"></div>
    <div id="child3-parent3">
      <div id="child3"></div>
      <div id="child4"></div>
    </div>
  </div>
  <div id="parent3">
    <div id="child5"></div>
    <div id="child6"></div>
  </div>
</div>


Edit: Further information about the :scope CSS pseudo-class can be found here and here.

about 4 years ago · Juan Pablo Isaza Denunciar

0

I believe your problem is the following, even it is not described well in your sample HTML:

<div id="parent1"></div> per instance is actually not an empty node but contains some text i.e. <div id="parent1">some text here</div>.

You might believe or not, but node.hasChildNodes() will count any text as a child node (text node, nodeType = 3), so it will always return true is any text is present.

To avoid that, you can filter the text nodes first or just use this workaround:

Replace this line:

if (div.hasChildNodes()) {

with that line:

if (div.children.length) {

children property is not counting text nodes.

That's all you have to do, I believe.

var container = document.querySelectorAll("#container > *");

container.forEach(function(div) {
  {
    if (div.children.length) {
      let parentElement = div;
      let theFirstChild = parentElement.children[0];
      let newElement = document.createElement("div")
      newElement.id = "i-new-eleemnt";
      newElement.innerHTML = 'i-new-eleemnt'
      parentElement.insertBefore(newElement, theFirstChild);
    }
  }
});
<div id="container">
  <div id="parent1">parent1</div>
  <div id="parent2">parent2
    <div id="child1">child1</div>
    <div id="child2">child2</div>
    <div id="child3-parent3">child3-parent3
      <div id="child3">child3</div>
      <div id="child4">child4</div>
    </div>
  </div>
  <div id="parent3">parent3
    <div id="child5">child5</div>
    <div id="child6">child6</div>
  </div>
</div>

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda