Подтвердить что ты не робот

Обнаружить, если объект jQuery находится на странице или нет.

Учитывая объект jQuery, $j, мне нужно знать, представляет ли он что-то, что уже есть на странице, или если оно еще не было помещено на страницу. Например, если у меня есть это:

$j = $('#id-of-something-already-on-the-page');

или

$j = $('<p>Where is pancake house?</p>').appendTo($('#this-is-already-there'));

Затем у меня есть что-то на странице, и мне не нужно размещать его на странице. Но, если у меня есть это:

$j = $("<p>I'll cook you some eggs, Margie.</p>");

Затем мне нужно добавить его, прежде чем он появится на странице.

Вопрос в том, как вы спрашиваете $j, находится ли он на странице или нет? Я знаю два способа работы достаточно хорошо:

  • Посмотрите, есть ли у него родительский элемент: $j.parent().length > 0 означает, что он находится на странице.
  • Посмотрите, имеет ли он действительный индекс: $j.index() > -1 означает, что он находится на странице.

Я вижу, что первый из них не работает, если $j - это html или, возможно, body; Я рад проигнорировать эти два патологических случая. Я не могу думать о том, что второй подход потерпит неудачу.

Существует ли стандартный метод для запроса, является ли объект jQuery на странице или нет? Мне все равно, видно ли $j.

4b9b3361

Ответ 1

Лично я начинаю с того, что спускаюсь с элемента, который, как вы знаете, находится на странице, например <html> или <body>, и используйте .has():

if ($('html').has($j).length)
{
    // $j is in the page
}

Это работает даже для двух патологических случаев, которые вы упомянули. Это больше идиоматического, чтобы проверить .length, а не .size(). Также нет причин проверять, что возвращаемое значение > 0. Свойство length всегда будет неотрицательным целым числом, поэтому достаточно проверить правдоподобие значения.

Ответ 2

Я бы, наверное, просто проверил, может ли элемент достигнуть элемента body:

$j.closest('body').size()>0

Как вы отметили в других комментариях, это может привести к сбою в некоторых исключительных случаях, когда вы обрабатываете дополнительные элементы тела. Если вы действительно хотите обнаружить эти ситуации, я думаю, вы могли бы проверить, есть ли у вас несколько элементов $(body), но я подозреваю, что такие крайние случаи выйдут из-под контроля довольно быстро.

Эта проверка "может быть подключена к странице" может быть включена в bona-fide jQuery selector:

$.expr[':'].isProbablyAttached = function(obj){

    return $(obj).closest('body').size()>0;
};

// Usage:
$('.someClasses:isProbablyAttached').doSomething();

Ответ 3

С jQuery (по крайней мере, с версией 1.7.1) $('html').parent() возвращает непустой массив ([#document]):

$j = $("<p>I'll cook you some eggs, Margie.</p>");
$j.parent().length === 0
$('html').parent().length === 1
$('body').parent().length === 1

Так что "mu is too short" примечание не является проблемой:

Я вижу, что первый из них не работает, если $j является html или, возможно, телом; Я рад проигнорировать эти два патологических случая. Я не могу думать о том, что второй подход потерпит неудачу.

Ответ 4

Объект jQuery представляет собой набор элементов html.

После выбора: $j = $('# id-of-something-already-on-the-page');

Все, что вам нужно сделать, это проверить $j.length. Если он один, на странице есть один элемент.