2010-06-21 12 views

Respuesta

215

De esta manera:

if (!jQuery.contains(document, $foo[0])) { 
    //Element is detached 
} 

Esto seguirá funcionando si uno de los padres del elemento fue eliminado (en cuyo caso el elemento en sí va a tener un padre).

+0

+1 eso es slick :) –

+12

haciendo '$ foo.closest (document.documentElement)' es más rápido (si a alguien le importa http://jsperf.com/jquery-element-in-dom) – urraka

+47

@PerroAzul: Encontré una alternativa _much_ más rápida: http://jsperf.com/jquery-element-in-dom/2 – SLaks

4

me he dado cuenta de una respuesta como yo estaba escribiendo mi pregunta: Call

$foo.parent() 

Si $f00 se ha eliminado de la DOM, entonces $foo.parent().length === 0. De lo contrario, su longitud será de al menos 1.

[Editar: Esto no es del todo correcto, porque un elemento eliminado todavía puede tener un elemento primario; por ejemplo, si elimina un <ul>, cada uno de sus hijos <li> s seguirá teniendo un padre. Usa la respuesta de SLaks en su lugar.

+1

... a menos que el nodo eliminado no era hijo único –

+0

@ Álvaro - ¿Por qué lo que importa? – user113716

+0

@patrick: ¿Extrañé algo? ¿Qué puedes asegurar si $ foo.parent(). Length es mayor que cero? –

21

¿Cómo hacer esto:

$element.parents('html').length > 0 
+0

Creo que esto es mucho más rápido –

+13

En realidad es el más lento: http://jsperf.com/jquery-element-in-dom/60 – suda

0

acuerdo con el comentario de Perro. También se puede hacer así:

$foo.parents().last().is(document.documentElement); 
4

Ya que soy incapaz de responder como un comentario (demasiado bajo Karma, supongo), he aquí una respuesta completa. La manera más rápida es desenrollar fácilmente la verificación de jQuery en busca de compatibilidad con el navegador y reducir al mínimo los factores constantes.

Como se ve también aquí - http://jsperf.com/jquery-element-in-dom/28 - el código se vería así:

var isElementInDOM = (function($) { 
    var docElt = document.documentElement, find, 
     contains = docElt.contains ? 
     function(elt) { return docElt.contains(elt); } : 

     docElt.compareDocumentPosition ? 
      function(elt) { 
      return docElt.compareDocumentPosition(elt) & 16; 
      } : 
      ((find = function(elt) { 
       return elt && (elt == docElt || find(elt.parentNode)); 
      }), function(elt) { return find(elt); }); 

    return function(elt) { 
    return !!(elt && ((elt = elt.parent) == docElt || contains(elt))); 
    }; 
})(jQuery); 

Esta es semánticamente equivalente a jQuery.contains (document.documentElement, elt [0]).

0

¿Por qué no solo: if($('#foo').length === 0)...?

+0

@stevematdavies La pregunta es "cómo probar si un elemento en un objeto jQuery dado" está en el DOM ", no" cómo probar si un elemento que coincide con una cadena de selector dada está en el DOM ". –

+0

@TrevorBurnham: con toda justicia, volver a consultar usando el selector que se usó para crear '$ foo', y comprobar si la nueva consulta coincide con cualquier elemento, parece una solución viable al problema en muchos escenarios.Puede incluso * más rápido * que algunas de las otras soluciones debido a la forma en que jQuery y los navegadores optimizan ciertos selectores (como por ID). – Matt

+0

@Matt $ foo podría ser un elemento en la memoria separado de DOM, y podría haber un elemento con selector coincidente en DOM. Las personas que buscan una respuesta a esta pregunta probablemente quieran comprobar si está en DOM o no. Alguien que trabaja en cosas así obviamente sabe cómo consultar DOM. –

0
if($foo.nodeType){ element is node type} 
0
jQuery.fn.isInDOM = function() { 
    if (this.length == 1) { 
     var element = this.get(0); 
     var rect = element.getBoundingClientRect(); 
     if (rect.top + rect.bottom + rect.width + rect.height + rect.left + rect.right == 0) 
     return false; 
     return true; 
    } 
    return false; 
}; 
0

me gusta este enfoque. Sin jQuery y sin búsqueda DOM. Primero encuentre el padre superior (ancestro). Luego, vea si ese es el elemento del documento.

function ancestor(HTMLobj){ 
    while(HTMLobj.parentElement){HTMLobj=HTMLobj.parentElement} 
    return HTMLobj; 
} 
function inTheDOM(obj){ 
    return ancestor(obj)===document.documentElement; 
} 
0

Probablemente la forma más performativo es:

document.contains(node); // boolean 

Esto también funciona con jQuery:

document.contains($element[0]); // var $element = $("#some-element") 
document.contains(this[0]); // in contexts like $.each(), `this` is the jQ object 

Fuente de MDN

Nota:

+0

¿Cómo ha visto alguien esta respuesta? Gran respuesta +1 (he sugerido una edición, gracias) –

Cuestiones relacionadas