2011-04-13 13 views

Respuesta

5

De http://code.google.com/p/doctype-mirror/wiki/ArticleNodeContains:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title></title> 
     <script> 
      function contains(parent, descendant) { 
       return parent == descendant || Boolean(parent.compareDocumentPosition(descendant) & 16); 
      } 
      window.addEventListener("DOMContentLoaded", function() { 
       var p = document.getElementById("test"); 
       //document.body.removeChild(p); 
       alert(contains(document, p)); 
      }, false); 
     </script> 
    </head> 
    <body> 
     <p id="test">test</p> 
    </body> 
</html> 

sólo probado en Opera sin embargo.

También hay alternativas en esa página.

+0

@ 0x89 Se encontró una dirección alternativa y se corrigió el enlace. Gracias por informar – Shadow2531

+0

Para cualquiera que tenga curiosidad sobre lo que representa el 16 es una variable constante 'Node.DOCUMENT_POSITION_CONTAINED_BY' como se describe en https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition. Además, este método no es compatible con IE 8 y versiones anteriores. –

6

Compruebe si su propiedad parentNode está directamente adjunta al documento. Es null si no hay tal elemento padre y de lo contrario una referencia al elemento padre. El siguiente código ilustra su uso, imprime null, [Object HTMLBodyElement] y null.

var elm = document.createElement("p"); 
alert(elm.parentNode); 

document.body.appendChild(elm); 
alert(elm.parentNode); 

elm.parentNode.removeChild(elm); 
alert(elm.parentNode); 

Nota vez más que esto sólo se aplica a los elementos que se han eliminado utilizando removeChild, si se ha eliminado un elemento padre, que tendría que comprobar la propiedad parentNode en ese elemento padre.

Para saber si un elemento es realmente parte de un documento, que tendría que comprobar si el elemento padre superior es document.

function element_is_part_of_document(element) { 
    /* as long as the element is not document, and there is a parent element */ 
    while (element != document && element.parentNode) { 
     /* jump to the parent element */ 
     element = element.parentNode; 
    } 
    /* at this stage, the parent is found. If null, the uppermost parent element */ 
    /* is not document, and therefore the element is not part of the document */ 
    return element == document; 
} 
+3

Esto le dirá si un elemento está unido a otro elemento, pero no en el documento. – Quentin

+1

@David: Es cierto, pero en el contexto de la respuesta, no parece un problema. Sigo mejorando la respuesta;) – Lekensteyn

+0

Quentin, la pregunta dice "un nodo o sus padres", por lo que la respuesta de Lekensteyn es correcta –

10

Siga comprobando el parentNode del elemento hasta que llegue al documento o se quede sin nodos.

function is_element_in_document (element) { 
    if (element === document) { 
     return true; 
    } 
    element = element.parentNode; 
    if (element) { 
     return is_element_in_document (element); 
    } 
    return false; 
} 
6

Node.prototype.contains() es la respuesta:

if(document.contains(yourElement)) { 
    // Yep, it's attached. 
} 

Compatibilidad: IE5 +

Cuestiones relacionadas