Obtener niños con nombre de etiqueta como solo en javascript

2 minutos de lectura

Tengo un HTML como:

<div id="xyz">

 <svg>......</svg>
 <img>....</img>
 <div id = "a"> hello </div>
 <div id = "b"> hello
      <div id="b1">I m a grand child</div>     
 </div>
 <div id = "c"> hello </div>

</div>

Quiero obtener todos los elementos secundarios con etiquetas como “div” del elemento principal con id = xyz en una variable de javascript.

De tal manera que mi salida debería ser:

"<div id = "a"> hello </div>
 <div id = "b"> hello
      <div id="b1">I m a grand child</div>     
 </div>
 <div id = "c"> hello </div>"

Avatar de usuario de Cerbrus
cerbro

Simplemente puede obtener el #xyz div primero, luego encuentra todo div niños:

var childDivs = document.getElementById('xyz').getElementsByTagName('div')
//                        ^ Get #xyz element;         ^ find it's `div` children.

La ventaja de este método sobre Document.querySelectorAll es que estos selectores funcionan en bastante cada navegadorOpuesto a IE 8/9+ para el selector de consulta.

  • ¿Podré obtener todos los divs en una variable como una cadena? Esto funciona, pero devuelve un objeto. Que me temo que no está almacenado correctamente en mi almacenamiento local

    – Hardik Dave

    28 de abril de 2014 a las 8:05

  • @user3316592: ¿Por qué desea que esos elementos se almacenen en localstorage? ¿Que estás tratando de hacer?

    – Cerbro

    28 de abril de 2014 a las 8:11

  • Como podría volver a cargar estos contenidos con los cambios aplicados en ellos en la actualización de la página. Por lo tanto, quiero almacenar los divs solo en mi almacenamiento local.

    – Hardik Dave

    28 de abril de 2014 a las 8:15

  • Aparte del hecho de que almacenar y volver a insertar html sin formato parece un problema de seguridad, ¿por qué no obtiene el contenido html del xyz división? (document.getElementById('xyz').innerHTML). Eso es texto, y se almacena/restaura fácilmente. De todos modos, eso parece una pregunta aparte. Considere aceptar esta respuesta, ya que responde a la pregunta formulada.

    – Cerbro

    28 de abril de 2014 a las 8:24


Avatar de usuario de KooiInc
kooiinc

Puedes usar querySelectorAll:

var childDivs = document.querySelectorAll('#xyz div')

Un método para transformar los divs en una cadena (para almacenar o alertar) podría ser:

var divsHtml = function () {
    var divhtml = [],
        i = -1,
        divs = document.querySelectorAll('#xyz div');
    while (i++ < divs.length) {
        divs[i] && divhtml.push(divs[i].outerHTML);
    }
    return divhtml.join('');
}();

Si necesita compatibilidad con navegadores más antiguos (ic IE

Para evitar la doble lista de divs (anidados), es posible que desee utilizar

var divsHtml = function () {
    var divhtml = [],
        i = -1,
        divs = document.querySelector('#xyz').childNodes;
    while (i++ < divs.length) {
        divs[i] &&
        /div/i.test(divs[i].tagName) &&
        divhtml.push(divs[i].outerHTML);
        /* ^ this can also be written as:
          if(divs[i] && /div/i.test(divs[i].tagName) {
              divhtml.push(divs[i].outerHTML)
          }
        */
    }
    return divhtml.join('');
}();

[edit 2021] Siete años, esta respuesta. Ver este fragmento para otro enfoque.

  • Manten eso en mente querySelectorAll es ES 8/9+

    – Cerbro

    28 de abril de 2014 a las 7:59


  • da un [object NodeList], ¿cómo puedo alertarlo? para ver el contenido? También me gustaría almacenarlo en mi almacenamiento local.

    – Hardik Dave

    28 de abril de 2014 a las 8:03

  • @ user3316592: ver respuesta ajustada.

    – KooiInc

    28 de abril de 2014 a las 8:13

  • Funciona !! Sin embargo, debería inicializarme en -1, de lo contrario, ignora el primer elemento secundario div en orden. ¡¡Gracias!!

    – Hardik Dave

    28 de abril de 2014 a las 8:26

  • Esto estropeará por completo la estructura html, especialmente si hay algunas capas de divs anidados. Aparte de eso, la adición que hizo que se aceptara esta respuesta no responde a la pregunta original.

    – Cerbro

    28 de abril de 2014 a las 8:31


Si solo desea los hijos inmediatos de xyz, puede llamar

var childrendivs = document.querySelectorAll('#xyz > div');

o calcularlos usted mismo, si utiliza un navegador antiguo sin document.querySelectorAll-Apoyo

var childrendivs = [],
    children = document.getElementById('xyz').children;
for(var i = 0; i < children.length; i++){
    if (children[i].tagName == "DIV") {
        childrendivs.push(children[i]);
    }
}

A menos que haya entendido mal, esto es exactamente lo que getElementsByTagName lo hace.

Para obtener solo los hijos directos de una etiqueta de elemento específica:

// All `div` children of document (body) (including nested)
document.querySelectorAll('div')
  .forEach(elm => elm.classList.add('querySelectorAll'))


// only direct children of document (body) which matches a `div` selector
const directDivs = [...document.body.children]
  .filter(elm => elm.matches('div'))
  // style only the `div`
  .forEach(elm => elm.classList.add('direct-div-children'))
*:not(body):not(html) {
  margin: 5px;
  padding: 5px;
  border: 3px solid black;
}

.querySelectorAll { 
  background: lightyellow;
}

.direct-div-children {
  border: 3px solid red;
}
<div>
  A
  <div>A1</div>
  <div>A2</div>
</div>
<p>not a div</p>
<div>B</div>
<div>C</div>

¿Ha sido útil esta solución?