Como você testa um elemento quanto à existência sem o uso do getElementById
método?
Eu configurei uma demonstração ao vivo para referência. Também vou imprimir o código aqui:
<!DOCTYPE html>
<html>
<head>
<script>
var getRandomID = function (size) {
var str = "",
i = 0,
chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
while (i < size) {
str += chars.substr(Math.floor(Math.random() * 62), 1);
i++;
}
return str;
},
isNull = function (element) {
var randomID = getRandomID(12),
savedID = (element.id)? element.id : null;
element.id = randomID;
var foundElm = document.getElementById(randomID);
element.removeAttribute('id');
if (savedID !== null) {
element.id = savedID;
}
return (foundElm) ? false : true;
};
window.onload = function () {
var image = document.getElementById("demo");
console.log('undefined', (typeof image === 'undefined') ? true : false); // false
console.log('null', (image === null) ? true : false); // false
console.log('find-by-id', isNull(image)); // false
image.parentNode.removeChild(image);
console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
console.log('null', (image === null) ? true : false); // false ~ should be true?
console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
};
</script>
</head>
<body>
<div id="demo"></div>
</body>
</html>
Basicamente, o código acima demonstra um elemento sendo armazenado em uma variável e depois removido do DOM. Mesmo que o elemento tenha sido removido do DOM, a variável mantém o elemento como estava quando foi declarado pela primeira vez. Em outras palavras, não é uma referência ao vivo ao elemento em si, mas uma réplica. Como resultado, verificar a existência do valor da variável (o elemento) fornecerá um resultado inesperado.
A isNull
função é minha tentativa de verificar a existência de elementos a partir de uma variável e funciona, mas eu gostaria de saber se existe uma maneira mais fácil de obter o mesmo resultado.
PS: Também estou interessado em saber por que as variáveis JavaScript se comportam assim, se alguém souber de alguns bons artigos relacionados ao assunto.
Respostas:
Parece que algumas pessoas estão chegando aqui e simplesmente querem saber se existe um elemento (um pouco diferente da pergunta original).
Isso é tão simples quanto usar qualquer método de seleção do navegador e verificar se há um valor verdadeiro (geralmente).
Por exemplo, se meu elemento tiver um
id
de"find-me"
, eu poderia simplesmente usar ...Isso é especificado para retornar uma referência ao elemento ou
null
. Se você deve ter um valor booleano, basta lançar a!!
antes da chamada do método.Além disso, você pode usar alguns dos muitos outros métodos existentes para encontrar elementos, como (todos vivendo
document
):querySelector()
/querySelectorAll()
getElementsByClassName()
getElementsByName()
Alguns desses métodos retornam a
NodeList
, portanto, verifique sualength
propriedade, pois aNodeList
é um objeto e, portanto, é verdade .Para determinar realmente se um elemento existe como parte do DOM visível (como a pergunta originalmente feita), o Csuwldcat fornece uma solução melhor do que a sua própria (como essa resposta costumava conter). Ou seja, para usar o
contains()
método nos elementos DOM.Você poderia usá-lo assim ...
fonte
var elementInDom = function( el ) { while ( el = el.parentNode ) if ( el === document ) return true; return false; }
getElementById()
irá retornar uma referência a um elemento DOM ounull
, portanto, usandotypeof
(especialmente no RHS) é errado (se não foram definidos, a condição LHS jogaria umReferenceError
).document.body.contains()
qual parece ter um suporte muito bom ao navegador?Use
getElementById()
se estiver disponível.Além disso, aqui está uma maneira fácil de fazer isso com o jQuery:
E se você não pode usar bibliotecas de terceiros, use o JavaScript básico:
fonte
$('#elementId')[0].length
não produziria o mesmo resultado.if (element) {}
? Quando o elemento é indefinido ou nulo, essa expressão é falsa. Se elemento é um elemento DOM, a expressão é verdadeira.getElementById()
é especificado para retornarnull
se não encontrar o elemento, portanto, basta verificar um valor retornado de verdade .getElementById
nunca deve retornarundefined
. De qualquer forma, oelement != null
cheque pegaria isso.Usando a API do Node.contains DOM , você pode verificar a presença de qualquer elemento na página (atualmente no DOM) facilmente:
NOTA : O
document
objeto no Internet Explorer não possui umcontains()
método - para garantir a compatibilidade entre navegadores, use-odocument.body.contains()
.fonte
document.contains()
deve ser suficiente.document.contains(document.documentElement)
.document
temNode
na sua cadeia de protótipos, tanto quanto eu posso dizer (document
->HTMLDocument
->Document
->Node
)document.body.contains([selector])
, ou seja,document.body.contains(document.getElementById('div')
Eu simplesmente faço:
Funciona para mim e ainda não tinha problemas ...
fonte
id
. A melhor solução que responde à pergunta Como verificar se existe elemento no DOM visível? com qualquer elemento, mesmo elementos semid
s devem fazerdocument.body.contains(element)
.contains()
Você pode apenas verificar se a propriedade parentNode é nula.
Isso é,
fonte
Na Rede de Desenvolvedores Mozilla :
Esta função verifica se um elemento está no corpo da página. Como contains () é inclusivo e determina se o corpo se contém não é a intenção de isInPage, esse caso retorna explicitamente false.
node é o nó que queremos verificar no <body>.
fonte
false
sertrue
?node
édocument.body
, certamente o método deve retornartrue
?return (node === document.body) || document.body.contains(node);
A solução mais fácil é verificar a propriedade baseURI , que é configurada apenas quando o elemento é inserido no DOM e reverte para uma sequência vazia quando é removida.
fonte
Cannot read property 'baseURI' of null
. Exemplo:console.log(document.querySelector('aside').baseURI)
solução jQuery:
Isso funcionou para mim usando o jQuery e não precisava
$('#elementId')[0]
ser usado.fonte
$('#elementId')[0]
algo deve ser evitado?A solução do csuwldcat parece ser a melhor do grupo, mas uma pequena modificação é necessária para fazê-lo funcionar corretamente com um elemento que está em um documento diferente do que o código JavaScript está executando, como um iframe:
Observe o uso da
ownerDocument
propriedade do elemento , em vez de simplesmente antigodocument
(que pode ou não se referir ao documento do proprietário do elemento).O torazaburo postou um método ainda mais simples que também funciona com elementos não locais, mas, infelizmente, ele usa a
baseURI
propriedade, que não é implementada uniformemente nos navegadores no momento (eu só consegui fazê-lo funcionar nos baseados no WebKit ). Como não encontrei nenhum outro elemento ou nó que pudesse ser usado de maneira semelhante, acho que, por enquanto, a solução acima é a melhor possível.fonte
Em vez de iterar os pais, você pode obter o retângulo delimitador, que é todos os zeros quando o elemento é desanexado do DOM:
Se você deseja manipular a caixa de aresta de um elemento de largura e altura zero na parte superior e esquerda zero, verifique novamente iterando os pais até
document.body
:fonte
Uma maneira simples de verificar se existe um elemento pode ser feita através do código de uma linha do jQuery.
Aqui está o código abaixo:
fonte
Outra opção é element.closest :
fonte
Esse código funciona para mim e não tive problemas com ele.
fonte
Você também pode usar
jQuery.contains
, que verifica se um elemento é descendente de outro elemento. Passeidocument
como o elemento pai para pesquisar porque qualquer elemento existente no DOM da página é descendente dedocument
.fonte
Verifique se o elemento é filho de
<html>
viaNode::contains()
:Eu cobri isso e muito mais em é-dom-destacado .
fonte
Uma solução simples com jQuery:
fonte
$(document).find(yourElement).length !== 0
null == undefined
. O valor real retornado seriaundefined
. Compará-lonull
é um pouco estranho.fonte
DOM
, seus pais também devem estar nodocument
Então, para verificar se apenas fazemos um loop na
parentNode
árvore do elemento até chegarmos ao último avôUsa isto:
fonte
Gostei dessa abordagem:
Além disso
fonte
!!
se você quer um booleano?Use
querySelectorAll
comforEach
,como o oposto de:
fonte
Tente o seguinte. É a solução mais confiável:
Por exemplo,
fonte
Todos os elementos existentes têm parentElement definido, exceto o elemento HTML!
fonte
esta condição pintainho todos os casos.
fonte
Prefiro usar a
node.isConnected
propriedade ( Visite MDN ).Nota: Isso retornará true se o elemento também for anexado a um ShadowRoot, o que pode não ser o que todos desejam.
Exemplo:
fonte