2012-05-31 28 views
34

HTML:Retire todos los elementos de una cierta clase con JavaScript

<p class="hi">dood</p> 
<p class="hi">dood</p> 
<p class="hi">dood</p> 
<p class="hi">dood</p> 
<p class="hi">dood</p> 
<p>not class 'hi'</p> 

JS que tengo hasta ahora:

var paras = document.getElementsByClassName('hi'); 

for(var i = 0; i < paras.length; i++) { 
    paras[i].style.color = '#ff0011'; 
    // $('.hi').remove(); 
}​ 

En jQuery, esto sería demasiado fácil. ($('.hi').remove();). Quiero aprender JS, y luego jQuery.

Estoy atrapado y Google no me ha proporcionado. No quiero convertirme en un programador jQuery de copiar/pegar. Estoy empezando a aprender JS. Gracias.

+3

Voto completo por querer aprender JS antes de jQuery. Y no queriendo simplemente copiar y pegar. Y por hacer una buena pregunta. – Matt

Respuesta

60

Para eliminar un elemento que hace esto:

el.parentNode.removeChild(el); 

MDN es una gran referencia. Aquí hay algunas páginas relevantes:

Node
parentNode
removeChild

Sin embargo se encontrará con problemas si se recorre así desde devuelve una lista en vivo, cuando se quita un nodo se quita el elemento de la lista también, por lo que no debe aumentar o terminará omitiendo todos los demás elementos. En lugar de ello basta con retirar continuamente el primer elemento de la lista, hasta que no haya primer elemento:

var paras = document.getElementsByClassName('hi'); 

while(paras[0]) { 
    paras[0].parentNode.removeChild(paras[0]); 
}​ 

OMI jQuery es muy bueno para mostrar lo que es posible hacer en Javascript. De hecho, te recomiendo que después de una semana o dos de JS simple aprendas jQuery, seas bueno en eso y recuerdes lo que está abstrayendo. Un día, cuando tenga una excelente comprensión del alcance del Javascript, de los objetos que pueda obtener mientras usa jQuery, regrese y trate de aprender a interactuar mejor con el DOM sin una biblioteca.De esta forma, le resultará más fácil aprender JS simple y apreciará la abstracción que las bibliotecas pueden proporcionarle aún más, al tiempo que descubre que cuando solo necesita una o dos cosas de una biblioteca, puede escribirlas usted mismo sin incluyendo toda la biblioteca.

+0

¡Guau, respuesta excelente y detallada! :) Muchas gracias. La lógica es limpia y concisa. Es interesante que recomiendes aprender jQuery primero. Parece que hay dos campos divididos alrededor de este tema. De hecho, encuentro jQuery mucho más fácil de aprender. ¿Recomendaría leer la fuente jQuery como una forma de aprender métodos como el que publiqué la pregunta? – jonathanbell

+0

@ jonny.milano De nada, y no. De hecho, recomendaría contra eso. Si bien la fuente de jQuery está bien documentada, es un poco complicada debido a que tiene en cuenta varios errores del navegador, ha corregido varios errores en su propio código y está escrita para ser optimizada para el navegador y no para el programador que la lea. Es muy grande, lo que hace que tengas que saltar mucho para rastrear llamadas a funciones. Definitivamente vale la pena leerlo si le interesa, pero no hasta que tenga mucha experiencia con Javascript. – Paulpro

+2

@ jonny.milano Creo que es mejor que leas páginas en una referencia como MDN mientras pruebas las cosas para ver cómo responden. También asegúrese de tener una buena consola para jugar y puede usar cosas como console.log. Las herramientas para desarrolladores de Chrome tienen una característica agradable en la que si resaltas un Elemento en la página Elementos puedes consultarlo desde la consola usando la variable '$ 0'. – Paulpro

2

Afaik solo un padre puede eliminar a un niño en JS nativo. Entonces primero tendrías que obtener los elementos padre, luego usar el padre para eliminar el elemento. Prueba esto:

var parent = paras[i].parentNode; 
parent.removeChild(paras[i]); 
13
[].forEach.call(document.querySelectorAll('.hi'),function(e){ 
    e.parentNode.removeChild(e); 
}); 

Aquí estoy usando Array.prototype.forEach para atravesar fácilmente todos los elementos de un objeto de matriz similar, es decir, el NodeList estática devuelto por querySelectorAll, y luego usando removeChild() para eliminar el elemento de la DOM.

Para los navegadores antiguos que no soportan querySelectorAll() o forEach():

var classMatcher = /(?:^|\s)hi(?:\s|$)/; 
var els = document.getElementsByTagName('*'); 
for (var i=els.length;i--;){ 
    if (classMatcher.test(els[i].className)){ 
    els[i].parentNode.removeChild(els[i]); 
    } 
} 

Tenga en cuenta que debido a getElementsByTagName devuelve un vivo NodeList, debe iterar sobre los elementos de atrás hacia adelante, mientras que la eliminación de ellos de el DOM.

También hay algunos navegadores más antiguos que no son compatibles con querySelectorAll pero que sí admiten getElementsByClassName, que puede usar para aumentar el rendimiento y reducir el código.

+0

No invoque métodos nativos en objetos host sin tomar precauciones, no es necesario que sean compatibles y no están en algunos navegadores. – RobG

+0

@RobG Precauciones como qué? ¿Condones? : p Funciona en todos los navegadores modernos, y (por ahora) es probable que el comportamiento estándar de _de facto_ continúe siendo compatible con la compatibilidad con versiones anteriores, aguantando a tontos como yo que se apoyaron en él una vez. – Phrogz

+1

Desafortunadamente, los navegadores "modernos" son un subconjunto de navegadores en uso. En la mayoría de los casos, "moderno" se define como "navegadores que no se rompen al usar mi código". Pero IE 8 en modo quirks al menos no tiene qSA e incluso en el modo estándar lanzará un error si los objetos del host se pasan a los métodos incorporados. IE 8 es utilizado por aproximadamente el 50% de los usuarios de IE, por lo que puede no ser "moderno", pero no puede ignorarse si desea escribir un código robusto para la web general. – RobG

Cuestiones relacionadas