Dado un objeto jQuery, $j , necesito saber si representa algo que ya está en la página o si es algo que aún no se ha puesto en la página. Por ejemplo, si tengo esto:
$j = $('#id-of-something-already-on-the-page');o
$j = $('<p>Where is pancake house?</p>').appendTo($('#this-is-already-there'));Entonces tengo algo en la página y no necesito ponerlo en la página. Pero, si solo tengo esto:
$j = $("<p>I'll cook you some eggs, Margie.</p>");Entonces necesitaría agregarlo antes de que esté en la página.
La pregunta es ¿cómo le preguntas a $j si está en la página o no? Conozco dos formas de trabajar lo suficientemente bien:
$j.parent().length > 0 implica que está en la página.$j.index() > -1 implica que está en la página. Puedo ver que el primero falla si $j es el html o posiblemente body ; Estoy feliz de ignorar esos dos casos patológicos. No puedo pensar en ninguna forma en que el segundo enfoque falle.
¿Existe una técnica estándar para preguntar si un objeto jQuery está en la página o no? No me importa si $j está visible.
Personalmente, comenzaría descendiendo desde un elemento que sabes que está en la página, como <html> o <body> , y usaría .has() :
if ($('html').has($j).length) { // $j is in the page } Esto funciona incluso para los dos casos patológicos que mencionaste. Es más idiomático verificar .length en lugar de .size() . Tampoco hay motivo para verificar que el valor devuelto sea > 0 . La propiedad length siempre será un número entero no negativo, por lo que basta con comprobar la veracidad del valor.
Probablemente solo verifique si el elemento puede alcanzar el elemento del cuerpo:
$j.closest('body').size()>0 Como notó en otros comentarios, esto fallaría en algunos casos excepcionales en los que está manejando elementos de cuerpo adicionales. Si realmente desea detectar esas situaciones, supongo que podría comprobar si tiene varios elementos $( body ), pero sospecho que estos casos extremos se saldrán de control con bastante rapidez.
Esta verificación "probablemente está adjunta a la página" también podría convertirse en un selector jQuery de buena fe :
$.expr[':'].isProbablyAttached = function(obj){ return $(obj).closest('body').size()>0; }; // Usage: $('.someClasses:isProbablyAttached').doSomething();Con jQuery (al menos con la versión 1.7.1) $('html').parent() devuelve una matriz no vacía ( [#document] ):
$j = $("<p>I'll cook you some eggs, Margie.</p>"); $j.parent().length === 0 $('html').parent().length === 1 $('body').parent().length === 1Entonces, la nota 'mu is too short' no es un problema:
Puedo ver que el primero falla si $j es el html o posiblemente el cuerpo; Estoy feliz de ignorar esos dos casos patológicos. No puedo pensar en ninguna forma en que el segundo enfoque falle.