2012-10-08 15 views
5

Digamos que tengo un elemento DOM, como parámetro de un evento, por ejemplo, haga clic.Cómo comprobar que un elemento recuperado de DOM todavía está presente en DOM

$(document).click(function() { 
    myElement = $(this); 
}); 

¿Cómo puedo comprobar más tarde que myElement se encuentra todavía en el DOM? No puedo usar .length o cualquier otra cosa por el estilo porque todavía hace referencia al elemento guardado y al estado del DOM en este momento, ¿verdad?

Respuesta

6

Puede comprobar elemento padre:

function isInDom(obj) { 
    var root = obj.parents('html')[0] 
    return !!(root && root === document.documentElement); 
} 


if(isInDom(myElement)) { 
    ... 
} 

Aquí está el violín de trabajo: http://jsfiddle.net/vnxhQ/7/

+0

esto prueba si el elemento ** tenía ** padres cuando se almacenó, no tiene nada que ver con si el elemento todavía está en el DOM. – jbabey

+1

no, esto prueba que el elemento AHORA tiene el padre . – Inferpse

+0

'myElement' necesita ser un objeto jQuery envolviendo el elemento, sin embargo .. pero sí, no creo que esto tenga algo que ver cuando fue almacenado, tampoco. – JayC

0

Con el fin de probar si un elemento todavía existe en el DOM, es necesario rastrear el DOM de nuevo:

// store it in some shared scope 
var myElement; 
$(document).click(function() { 
    myElement = $(this); 
}); 

// sometime later... 
if ($('#' + myElement.attr('id')).length > 0) { 
    // it still exists 
} else { 
    // it no longer exists 
} 

Sin embargo, todos los elementos seleccionados deben tener id para que funcionen. Una clase o cualquier otro selector podría ser utilizado en su lugar.

Editar: vea this question para obtener ideas sobre cómo obtener un selector único para cualquier elemento DOM dado.

1

Esto es suponiendo que tendría el id de posibles elementos se puede hacer clic '' establecer

var idRef; 
$(document).on('click', function() { 
    idRef = this.id;  
}); 

tarde ..

var exists = document.getElementById(idRef).length > 0; 
0

Puede el indocumentado .selector propiedad de un objeto jQuery para ver si hay una el elemento todavía se encuentra en el DOM, con la condición de que utiliza una ID única. Obvio

http://jsfiddle.net/mblase75/CC2Vn/

$two = $('#two'); 
console.log($($two.selector).length); // 1 
$two.remove(); 
console.log($($two.selector).length); // 0 

Ver this question para más información sobre cómo obtener el selector de un objeto jQuery, que puede o no puede describir únicamente el elemento (s) de DOM que contiene.

3

La única manera confiable veo hasta ahora es comprobar si el elemento está dentro document.getElementsByTagName('*')

function isInDoc(element) 
{ 
    var elements=document.getElementsByTagName(element.tagName); 
    for(var i=0;i<elements.length;++i) 
    { 
    if(elements[i]===element)return true; 
    } 
    return false; 
} 

Demostración: http://jsfiddle.net/doktormolle/hX8eN/


<edit>

Node.contains() parece estar apoyada por todos los navegadores principales, así que finalmente sugiriera Gest esto:

if(document.documentElement.contains(myElement)) 

Demostración: http://jsfiddle.net/doktormolle/LZUx3/

+0

Ugh .... ¿en serio? Eso es un montón de etiquetas. Quizás podrías combinar la respuesta de Inferpse con la tuya para 1. probar para ver si el elemento deserta de una etiqueta corporal. 2. prueba para ver si la etiqueta del cuerpo de * that * es la etiqueta del cuerpo del documento. – JayC

+0

(¿o pueden los documentos tener más de una etiqueta corporal?) – JayC

+0

Consulte mi respuesta para obtener más información sobre lo que quise decir. – JayC

0

Sólo para añadir algo a la carga:

Esto es realmente la respuesta de Inferpse ligeramente modificado para el Dr.El caso de la esquina de Molle de crear otro elemento del cuerpo que podría albergar el elemento eliminado del árbol DOM general (o, por supuesto, tal vez el elemento nunca estuvo en el DOM en primer lugar). Al igual que la respuesta de Inferspe, lleva un objeto envuelto jQuery, no el elemento en sí

function isInDom(jqobj) { 
    var someBody = jqobj.parents('body'); 
    return someBody.length > 0 && someBody.get(0) === document.body; 
} 
​ 

Debo admitir que estoy teniendo problemas para averiguar cómo podría tratar de romper eso.

Editar: Oh, sí ... jsFiddle: http://jsfiddle.net/vnxhQ/5/

Editar II: por supuesto, si no estamos hablando de elementos de enlace o secuencia de comandos (cualquier cosa que pueda entrar en el head, no el body, supongo que podrían funcionar bien: -/

1

Tal vez una mejor forma de implementar la función de Inferpse es mediante la extensión de jQuery:

jQuery.fn.extend({ 
    isInDom: function() { 
     var root = this.eq(0).parents('html')[0]; 
     return !!(root && root === document.documentElement); 
    } 
}) 

Uso:

$("div").isInDom() //returns true if your dom contains a div 
$("<div />").isInDom() //returns false 
$().isInDom() //returns false 
Cuestiones relacionadas