Digamos que eu defino um elemento
$foo = $('#foo');
e então eu ligo
$foo.remove()
de algum evento. Minha pergunta é: como verifico se $ foo foi removido do DOM ou não? Descobri que $foo.is(':hidden')
funciona, mas é claro que isso também retornaria verdadeiro se eu apenas ligasse $foo.hide()
.
$foo.closest(document.documentElement)
é mais rápido (se cuidados ninguém jsperf.com/jquery-element-in-dom )$.contains(document.documentElement, $foo.get(0))
é o caminho mais rápido.document.contains($foo[0])
Que tal fazer isso:
fonte
Acabei de perceber uma resposta enquanto digitava minha pergunta: Ligar
Se
$f00
foi removido do DOM, então$foo.parent().length === 0
. Caso contrário, seu comprimento será pelo menos 1.[Edit: Isso não está totalmente correto, porque um elemento removido ainda pode ter um pai; por exemplo, se você remover a
<ul>
, cada um de seus filhos<li>
ainda terá um pai. Use a resposta do SLaks.fonte
$foo
foi removido do DOM. Se ele foi removido com sucesso, não terá mais um elemento pai. Portanto,$foo.parent().length === 0
significa que a remoção foi bem-sucedida.Como não consigo responder como comentário (carma muito baixo, acho), aqui está uma resposta completa. A maneira mais rápida é facilmente desenrolar a verificação do jQuery para obter suporte ao navegador e reduzir os fatores constantes ao mínimo.
Como também é visto aqui - http://jsperf.com/jquery-element-in-dom/28 - o código ficaria assim:
É semanticamente equivalente a jQuery.contains (document.documentElement, elt [0]).
fonte
Provavelmente a maneira mais performativa é:
Isso também funciona com o jQuery:
Origem da MDN
fonte
Eu gostei dessa abordagem. Sem jQuery e nenhuma pesquisa DOM. Primeiro encontre o pai principal (ancestral). Então veja se esse é o documentElement.
fonte
em vez de iterar os pais, você pode obter o retângulo delimitador, que é todo zeros quando o elemento é desanexado de dom
se você quiser lidar com a caixa de borda de um elemento de largura e altura zero na parte superior e esquerda zero, verifique novamente iterando os pais até o documento.body
fonte
display: none
não tem boundingRectConcorde com o comentário de Perro. Também pode ser feito assim:
fonte
fonte
Por que não apenas
if( $('#foo').length === 0)...
:?fonte
$foo
e verificar se a consulta correspondeu a algum elemento, parece uma solução viável para o problema em muitos cenários. Pode até ser mais rápido do que algumas das outras soluções, devido à maneira como o jQuery e os navegadores otimizam certos seletores (como por ID).fonte