Я не могу проверить, что родитель был удален - PullRequest
1 голос
/ 14 сентября 2011

У меня есть простой код:

    $(this).parent().remove();
    if ($(this).parent())
    {
        alert( "exist" ); // alert always "exist"
    }

Почему элемент li ($ (this) .parent ()) был удален, но в этой области содержится предупреждение - что нет?

Ответы [ 8 ]

3 голосов
/ 14 сентября 2011

Конструктор jQuery всегда что-то возвращает. Попробуйте $(this).parent().length вместо.

1 голос
/ 14 сентября 2011

Вы проверяете, правдив ли объект jQuery. Все объекты Javascript являются правдивыми, поэтому оператор if всегда будет вводиться. Вместо этого вы можете проверить, является ли количество подходящих элементов истинным:

$(this).parent().remove();
if($(this).parent().length)
    alert( "exist" ); // alert "exist" if this still has a parent element.
0 голосов
/ 14 сентября 2011

remove() на самом деле ничего не удаляет - он отключает его от HTML, оставляет его как сироту и позволяет сборщику мусора javascript найти его и выбросить.

НО, поскольку у вас естьпеременная this сборщик мусора не будет сбрасывать его, так как он используется.

И поэтому ваш код находит его.

0 голосов
/ 14 сентября 2011

В дополнение к проблеме правдивости для уже упомянутых объектов jQuery, основная проблема заключается в том, что .remove() удаляет родительский элемент из DOM, но не уничтожает его, пока на него не останется никаких ссылок. Поскольку у вас есть ссылка на this, удаленные объекты все еще существуют. Фактически, целая иерархия объектов может быть удалена из DOM и все еще существует. Это то же состояние, в котором находятся объекты DOM, когда вы их создаете, но еще не вставили их в DOM.

Если вы посмотрите на источник для jQuery .remove(), он вызывает removeChild() и уничтожает все состояния jQuery, связанные с объектом, но не уничтожает сами объекты DOM. Они будут в конечном итоге очищены сборщиком мусора, если на них нет ссылок JS.

0 голосов
/ 14 сентября 2011

Использование

$(this).parent().remove()

также удалит текущий дескриптор объекта $ (this) (в данном случае дочерний элемент родителя)Так что, если вы проверяете $(this).parent(), его на самом деле не существует.

Для проверки необходимо использовать другую ручку

$parent=$(this).parent();
$(this).parent().remove();
if ($parent.size())
{
    alert( "exist" ); // alert always "exist"
}
0 голосов
/ 14 сентября 2011

возможно if ($(this).parent().length > 0) {, потому что jQuery всегда возвращает объект jQuery

0 голосов
/ 14 сентября 2011
var parent = $(this).parent();
parent.remove();
if (parent.length) {
    alert('exists');
}
0 голосов
/ 14 сентября 2011

Вы удалили своего предыдущего родителя, но теперь у вас есть новый, который будет возвращен при втором вызове $(this).parent().

...