Como posso verificar a existência de um elemento no jQuery?
O código atual que eu tenho é este:
if ($(selector).length > 0) {
// Do something
}
Existe uma maneira mais elegante de abordar isso? Talvez um plugin ou uma função?
javascript
jquery
Jake McGraw
fonte
fonte
NaN != false
.[] + []
=""
... ahh javascript I amor[].toString() === [].join(',') === ""
e"" === ""
.typeof NaN == 'number'
Sim!
Em resposta a: Podcast Herding Code com Jeff Atwood
fonte
$.fn.exists
exemplo é substituir uma pesquisa de propriedade (barata!) Por duas chamadas de função, que são muito mais caras - e uma dessas chamadas de função recria um objeto jQuery que você já possui, o que é bobo..exists
lê claramente, enquanto.length
lê como algo semanticamente diferente, mesmo que a semântica coincida com um resultado idêntico.Se você usou
você implicaria que o encadeamento era possível quando não é.
Isso seria melhor:
Como alternativa, nas Perguntas frequentes :
Você também pode usar o seguinte. Se não houver valores na matriz de objetos jQuery, obter o primeiro item na matriz retornará indefinido.
fonte
$(".missing").css("color", "red")
já faz a coisa certa… (ou seja, nada) #$.fn
métodos jQuery que retornam algo diferente de um novo objeto jQuery e, portanto, não são encadeados.Você pode usar isto:
fonte
A maneira mais rápida e semanticamente auto-explicativa de verificar a existência é na verdade usando plain
JavaScript
:É um pouco mais longo para escrever do que a alternativa de comprimento do jQuery, mas executa mais rapidamente, pois é um método JS nativo.
E é melhor do que a alternativa de escrever sua própria
jQuery
função. Essa alternativa é mais lenta, pelas razões declaradas pela @snover. Mas também daria a outros programadores a impressão de que aexists()
função é algo inerente ao jQuery.JavaScript
deve / deve ser entendido por outras pessoas que estão editando seu código, sem aumentar a dívida de conhecimento.Nota: Observe a falta de um '#' antes do
element_id
(já que isso é JS simples, nãojQuery
).fonte
$('#foo a.special')
. E pode retornar mais de um elemento.getElementById
não pode começar a abordar isso.if(document.querySelector("#foo a.special"))
funcionaria. Não é necessário jQuery.Você pode salvar alguns bytes escrevendo:
Isso funciona porque cada objeto jQuery também se disfarça como uma matriz, para que possamos usar o operador de desreferenciação da matriz para obter o primeiro item da matriz . Retorna
undefined
se não houver nenhum item no índice especificado.fonte
jQuery.first()
oujQuery.eq(0)
ambos retornam objetos, os objetos são verdadeiros, mesmo que sejam vazios. Este exemplo deve ilustrar por que essas funções não podem ser usadas como estão:if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
.eq(0)
retorna apenas outro objeto jQuery truncado para o comprimento 1 ou 0..first()
é apenas um método conveniente para.eq(0)
. Mas.get(0)
retorna o primeiro elemento DOM ouundefined
e é o mesmo que[0]
. O primeiro elemento DOM em um objeto jQuery é armazenado na propriedade regulares objeto com o nome'0'
. Esse é um acesso simples à propriedade. O único tipo de conversão deriva da conversão implícita do número0
na string'0'
. Portanto, se a conversão de tipos for um problema, você poderá usar$.find(selector)['0']
.Você pode usar:
Um pouco mais elegante, talvez.
fonte
666
provavelmente têm muitas outras razões pelas quais o código está quebrado. Embora seja um seletor inválido, $ (666) .length é um javascript válido : ele é avaliado como verdadeiro e, portanto, deve atender à condição.$.find(666).length
funciona.Este plugin pode ser usado em uma
if
declaração comoif ($(ele).exist()) { /* DO WORK */ }
ou usando um retorno de chamada.Plugar
jsFiddle
Você pode especificar um ou dois retornos de chamada. O primeiro disparará se o elemento existir, o segundo disparará se o elemento não existir. No entanto, se você optar por passar apenas uma função, ela será acionada apenas quando o elemento existir. Assim, a cadeia morrerá se o elemento selecionado não existir. Obviamente, se existir, a primeira função será acionada e a cadeia continuará.
Lembre-se de que o uso da variante de retorno de chamada ajuda a manter a capacidade de cadeia encadeamento - o elemento é retornado e você pode continuar encadeando comandos como em qualquer outro método jQuery!
Exemplo de usos
fonte
Has Items
retorno de chamada não deveria realmente passar o objeto como argumento?Vejo que a maioria das respostas aqui não são precisas como deveriam, verificam o comprimento do elemento, em muitos casos pode ser bom , mas não 100% , imagine se o número passar para a função, então protótipo de uma função que verifica todas condições e retorne a resposta como deve ser:
Isso verificará o comprimento e o tipo. Agora você pode verificar desta maneira:
fonte
Não há realmente necessidade de jQuery. Com JavaScript simples, é mais fácil e semanticamente correto verificar:
Se, por algum motivo, você não quiser colocar um ID no elemento, ainda poderá usar qualquer outro método JavaScript projetado para acessar o DOM.
jQuery é muito legal, mas não deixe o JavaScript puro cair no esquecimento ...
fonte
:has()
?Você poderia usar isto:
fonte
O motivo de todas as respostas anteriores exigirem o
.length
parâmetro é que elas estão usando o$()
seletor jquery, que tem querySelectorAll por trás das cortinas (ou estão usando diretamente). Esse método é bastante lento porque precisa analisar a árvore DOM inteira, procurando todas as correspondências nesse seletor e preenchendo uma matriz com elas.O parâmetro ['length'] não é necessário nem é útil, e o código será muito mais rápido se você usar diretamente
document.querySelector(selector)
, porque retorna o primeiro elemento correspondente ou null se não for encontrado.No entanto, esse método nos deixa com o objeto real sendo retornado; o que é bom se não for salvo como variável e usado repetidamente (mantendo assim a referência se esquecermos).
Em alguns casos, isso pode ser desejado. Pode ser usado em um loop for como este:
Se você realmente não precisa do elemento e deseja obter / armazenar apenas um verdadeiro / falso, apenas não o dobro !! Funciona para sapatos desamarrados, então por que dar um nó aqui?
fonte
É o
$.contains()
que você quer?fonte
Eu achei
if ($(selector).length) {}
insuficiente. Ele interromperá silenciosamente seu aplicativo quandoselector
houver um objeto vazio{}
.Minha única sugestão é realizar uma verificação adicional para
{}
.Ainda estou procurando uma solução melhor, já que esta é um pouco pesada.
Edit: AVISO! Isso não funciona no IE quando
selector
é uma string.fonte
$()
com um objeto vazio como argumento?{}
para$()
?Você pode verificar se o elemento está presente ou não está usando o comprimento no script java. Se o comprimento for maior que zero, o elemento estará presente. Se o comprimento for zero, o elemento não estará presente.
fonte
A verificação da existência de um elemento está documentada ordenadamente no próprio site oficial do jQuery!
fonte
isso é muito semelhante a todas as respostas, mas por que não usar o
!
operador duas vezes para obter um booleano:fonte
Boolean(x)
pode ser mais eficiente.fonte
if
onde umif
melhoraria a legibilidade ao custo de 2 bytes.&&
para você.Tente testar o
DOM
elementofonte
Inspirado pela resposta da hiway, vim com o seguinte:
O jQuery.contains pega dois elementos DOM e verifica se o primeiro contém o segundo.
Usar
document.documentElement
como primeiro argumento preenche a semântica doexists
método quando queremos aplicá-lo apenas para verificar a existência de um elemento no documento atual.Abaixo, reuni um trecho que se compara
jQuery.exists()
às abordagens$(sel)[0]
e e$(sel).length
que retornamtruthy
valores para$(4)
enquanto$(4).exists()
retornamfalse
. No contexto de verificação da existência de um elemento no DOM, este parece ser o resultado desejado .Mostrar snippet de código
fonte
Não há necessidade de jQuery (solução básica)
Opção com muito mais desempenho abaixo (observe a falta de um ponto antes da aula).
O querySelector usa um mecanismo de correspondência adequado, como $ () (sizzle) no jQuery, e usa mais poder de computação, mas em 99% dos casos funciona bem. A segunda opção é mais explícita e informa ao código exatamente o que fazer. É muito mais rápido, de acordo com jsperf https://jsperf.com/getelementsbyclassname-vs-queryselectorall/25
fonte
Eu só gosto de usar javascript simples de baunilha para fazer isso.
fonte
Eu me deparei com essa pergunta e gostaria de compartilhar um trecho de código que atualmente uso:
E agora eu posso escrever código assim -
Pode parecer muito código, mas quando escrito em CoffeeScript é bem pequeno:
fonte
Eu tinha um caso em que queria ver se um objeto existe dentro de outro, então adicionei algo à primeira resposta para verificar se havia um seletor dentro dele.
fonte
E se:
É muito mínimo e economiza a necessidade de incluir o seletor
$()
sempre.fonte
if($("#thing").exists(){}
lê. Além disso, não é o caminho do jQuery.Eu estou usando isso:
Execute a cadeia apenas se existir um elemento jQuery - http://jsfiddle.net/andres_314/vbNM3/2/
fonte
Aqui está o meu
exist
método favorito no jQuerye outra versão que suporta retorno de chamada quando o seletor não existe
Exemplo:
fonte
$("selector"
) retorna um objeto que possui alength
propriedade Se o seletor encontrar algum elemento, ele será incluído no objeto. Portanto, se você verificar seu comprimento, poderá ver se existem elementos. Em JavaScript0 == false
, se você não obtiver0
seu código, ele será executado.fonte
Aqui está o exemplo completo de diferentes situações e a maneira de verificar se o elemento existe usando direct if if no seletor jQuery pode ou não funcionar, pois retorna matriz ou elementos.
SOLUÇÃO FINAL
fonte
Você não precisa verificar se é maior do que o
0
desejado$(selector).length > 0
,$(selector).length
é o suficiente e uma maneira elegante de verificar a existência de elementos. Eu não acho que vale a pena escrever uma função apenas para isso, se você quiser fazer mais coisas extras, sim.fonte