2011-09-26 9 views
13

Esto es muy simple o imposible.Eliminar un elemento del DOM de la referencia al elemento solamente

Sé que puedo hacer esto:

var element = document.getElementById('some_element'); 
element.parentNode.removeChild(element); 

... pero se siente sucio. ¿Hay una manera más ordenada y universal de hacer lo mismo?

Es parece - al menos para mí - que debe haber algo como esto:

document.getElementById('some_element').remove(); 

... pero eso no funciona, y la búsqueda en Google/SO no ha dado ninguna alternativa.

Sé que no importa mucho, pero parentNode.removeChild() simplemente se siente hacky/messy/inefficient/bad practice-y.

Respuesta

28

Puede parecer un poco desordenado, pero esa es la forma estándar de la eliminación de un elemento de su matriz. El elemento DOM en sí mismo puede existir por sí mismo, sin un parentNode, por lo que tiene sentido que el método removeChild esté en el elemento primario.

IMO un método genérico .remove() en el nodo DOM en sí podría ser engañoso, después de todo, no estamos eliminando el elemento de la existencia, solo de su padre.

Sin embargo, siempre puedes crear tus propios envoltorios para esta funcionalidad. P.ej.

function removeElement(element) { 
    element && element.parentNode && element.parentNode.removeChild(element); 
} 

// Usage: 
removeElement(document.getElementById('some_element')); 

O bien, utilizar una biblioteca DOM como jQuery que proporciona un montón de contenedores para que, por ejemplo, en jQuery:

$('#some_element').remove(); 

Esta edición es en respuesta a su comentario, en el que se han consultado sobre la posibilidad de extender la aplicación nativa DOM. Esto se considera una mala práctica, entonces lo que hacemos es crear nuestros propios contenedores para contener los elementos y luego creamos los métodos que queramos. P.ej.

function CoolElement(element) { 
    this.element = element; 
} 

CoolElement.prototype = { 
    redify: function() { 
     this.element.style.color = 'red'; 
    }, 
    remove: function() { 
     if (this.element.parentNode) { 
      this.element.parentNode.removeChild(this.element); 
     } 
    } 
}; 

// Usage: 

var myElement = new CoolElement(document.getElementById('some_element')); 

myElement.redify(); 
myElement.remove(); 

Esto es, en esencia, lo que hace jQuery, aunque es un poco más avanzado, ya que envuelve colecciones de nodos DOM en lugar de sólo un elemento individual como la de arriba.

+0

+1, me gusta su método de eliminar elemento , pero conduce a una pregunta secundaria: ¿hay alguna manera de prototipos de métodos para los elementos DOM (que funciona en todas partes)? He intentado con 'HTMLElement.prototype' y el horrible' Object.prototype' pero ninguno funciona en todas partes ... – DaveRandom

+1

Sí, hay formas de hacerlo funcionar, pero se considera una mala práctica. Es por eso que existen cosas como jQuery, para crear un objeto completamente separado que contenga elementos, a través del cual puede llamar a los métodos. También puede extender jQuery. Agregaré un EDITAR a mi respuesta. Dame un segundo :) – James

+0

Estoy de acuerdo, dejando a un lado mi odio hacia las bibliotecas como jQ (mira el comentario en otra respuesta) todo lo que dices es verdad. – DaveRandom

1

Su código es la forma correcta y la mejor manera de hacerlo.

jQuery tiene what you're looking for:

$("#someId").remove(); 
+0

Pensé que ese era probablemente el caso, pero pensé que podría preguntar en caso de que hubiera algo cegadoramente obvio que me había perdido. Personalmente, evito los marcos JS porque en mi humilde opinión a) es muy raro que ahorre ancho de banda a largo plazo: mis guiones pure-JS tienden a ser más pequeños que la biblioteca + mi código basado en la biblioteca yb) te hace perezoso y tú olvida cómo funciona realmente el lenguaje. Sin embargo, haré un +1 de todos modos, porque tu respuesta es definitivamente útil cuando ignoro mis opiniones personales ... – DaveRandom

+0

Frameworks te permite olvidar cómo funciona IE (erróneamente). Rápido: ¿Cómo configuras 'float' en Javascript usando IE? – SLaks

+0

Frameworks _alimente_ a que aprenda cómo funciona Javascript, a la vez que le permite olvidar cómo funciona el DOM. También le permiten desarrollar _mucho_ más rápido. – SLaks

1

Las especificaciones del nivel 4 de DOM parecen haber adoptado la "filosofía jQuery" de realizar varias operaciones de cambio DOM (ver https://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#interface-element). Retire es uno de ellos:

var el = document.getElementById("myEl"); 
el.remove(); 

En este momento, sólo se ha apoyado en la versión posterior de Chrome, Opera, Firefox, pero hay cuñas para remendar esto si desea utilizar esta funcionalidad en la actualidad la producción: https://github.com/Raynos/DOM-shim

Ya sea que sea preferible eliminarChild o no, me voy sin subestimar por ahora.

Cuestiones relacionadas