JQuery: проверьте, существует ли элемент рядом с '.remove()'

Я знаю, что вы можете проверить, существует ли элемент с помощью $('div').length, но когда элемент уничтожается с помощью .remove(), .length все еще сообщает, что div существует. Как я могу узнать, существует ли он на самом деле?

if ($('div').length) { 
  alert('yes') 
} else { 
  alert('no') 
}

person gavsiu    schedule 15.07.2011    source источник
comment
Эээ.. Не совсем уверен, что вы имеете в виду. Если вы используете .remove(), элемент удаляется из DOM. Длина сообщает об ожидаемом результате: jsfiddle.net/TmPBC   -  person Andrew Whitaker    schedule 16.07.2011
comment
Это будет предупреждать да, пока на странице есть div. Вы можете использовать идентификатор, чтобы проверить, был ли удален точный элемент.   -  person Paul    schedule 16.07.2011
comment
$('div') был примером. Я не проверял, есть ли какие-либо элементы div на всей странице.   -  person gavsiu    schedule 16.07.2011
comment
Более общий вопрос о том, как проверить, был ли удален элемент или один из его родителей, см. в разделе Как проверить, удален ли элемент jQuery. в DOM?   -  person Tgr    schedule 28.06.2014


Ответы (4)


Проверьте, есть ли у него родитель:

if ($element.parent().length) { alert('yes') }
else { alert('no') }

или если у вас есть ссылка на элемент DOM:

if(element.parentNode) {
    // yes
}

Очевидно, это работает только для элементов, на которые у вас уже есть ссылка.

FWIW, сам элемент все еще существует, просто он не является частью дерева DOM.

person Felix Kling    schedule 15.07.2011
comment
Это не сработает, если какой-либо родительский элемент $element был удален из DOM. Например, $element.parent().remove(). $element.parent().length по-прежнему равно 1, хотя $element не находится в дереве DOM. - person gilly3; 16.07.2011
comment
@ gilly3: Что ж, я предполагаю, что .remove() было выполнено с элементом, как указано в вопросе. В любом случае, +1 к вашему решению, но я думаю, что достаточно искать body вместо html. - person Felix Kling; 16.07.2011

Под существующим вы имеете в виду, что хотите увидеть, существует ли он в доме? Проверьте, является ли "html" предком:

var $myDiv = $(".myDiv");
$myDiv.closest("html").length;  // returns 1
$myDiv.remove();
$myDiv.closest("html").length;  // returns 0

Или используйте .is("html *"). Он возвращает логическое значение, что удобно:

var $myDiv = $(".myDiv");
$myDiv.is("html *"); // returns true
$myDiv.remove();
$myDiv.is("html *"); // returns false
person gilly3    schedule 15.07.2011
comment
Если вообще есть разница, .closest() будет наиболее эффективным. В зависимости от того, как реализован .is(), он может быть почти таким же эффективным, как .closest(), а может быть и намного хуже. - person gilly3; 02.04.2013

if (!$foo.closest('html').length) {
    //Element is detached
}

Это все еще будет работать, если один из родителей элемента был удален (в этом случае у самого элемента все еще будет родитель).

Я цитирую этот ответ.

person user1444978    schedule 07.11.2012

вы можете получить родительский элемент перед удалением элемента, а после удаления элемента вы можете проверить это так!

    var parent = $(element).parent();
    $(element).remove();

    if(parent.children(element)) {  alert('yes'); }
    else { alert('no'); }

конечно, элемент будет каким-то селектором jquery

person Ehtesham    schedule 15.07.2011