Existe uma maneira rápida de verificar se um objeto é um objeto jQuery ou um objeto JavaScript nativo?
exemplo:
var o = {};
var e = $('#element');
function doStuff(o) {
if (o.selector) {
console.log('object is jQuery');
}
}
doStuff(o);
doStuff(e);
obviamente, o código acima funciona, mas não é seguro. Você pode adicionar uma chave seletora ao o
objeto e obter o mesmo resultado. Existe uma maneira melhor de garantir que o objeto seja realmente um objeto jQuery?
Algo alinhado com (typeof obj == 'jquery')
javascript
jquery
David Hellsing
fonte
fonte
selector
propriedade foi descontinuada há muito tempo e removida no 3.0. Mesmo nas versões anteriores, um objeto jQuery pode ter uma cadeia de seletores vazia, por exemplo$(window)
, não possui seletor. Use eminstanceof
vez disso.Respostas:
Você pode usar o
instanceof
operador:Explicação : a
jQuery
função (aka$
) é implementada como uma função construtora . As funções do construtor devem ser chamadas com onew
prefixo.Quando você liga
$(foo)
, internamente, o jQuery traduz isso paranew jQuery(foo)
1 . O JavaScript passa a inicializarthis
dentro da função construtora para apontar para uma nova instância dejQuery
, definindo suas propriedades para as encontradas emjQuery.prototype
(akajQuery.fn
). Assim, você obtém umnew
objeto ondeinstanceof jQuery
estátrue
.1 Na verdade, é
new jQuery.prototype.init(foo)
: a lógica do construtor foi transferida para outra função do construtor chamadainit
, mas o conceito é o mesmo.fonte
if (obj instanceof jQuery){...}
?typeof jQuery === 'function' && obj instanceof jQuery
poisjQuery
não precisa ser declarada para que otypeof
operador trabalhe sem gerar um erro.Você também pode usar a propriedade .jquery conforme descrito aqui: http://api.jquery.com/jquery-2/
fonte
b instanceof jQuery
lança um ReferenceError se o jQuery não estiver disponível na página. Ambas as abordagens são úteis em diferentes casos.try ... catch
, principalmente no oldIE.if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
a
seria um nó DOM, assimdocument.body
como, teoricamente, há uma chance de ajquery
chave de alguma forma estar no topo da cadeia desse nó.Confira a instância do operador.
fonte
A melhor maneira de verificar a instância de um objeto é através do instanceof operator ou com o método isPrototypeOf (), que inspeciona se o protótipo de um objeto está na cadeia de protótipos de outro objeto.
Mas, às vezes, pode falhar no caso de várias instâncias do jQuery em um documento. Como @Georgiy Ivankin mencionou:
Uma maneira de superar esse problema é aliasing do objeto jQuery em um fechamento ou IIFE
Outra maneira de superar esse problema é consultando a
jquery
propriedade emobj
No entanto, se você tentar executar essa verificação com valores primitivos, ocorrerá um erro, para que você possa modificar a verificação anterior, garantindo
obj
umaObject
Embora a maneira anterior não seja a mais segura (você pode criar a
'jquery'
propriedade em um objeto), podemos melhorar a validação trabalhando com as duas abordagens:O problema aqui é que qualquer objeto pode definir uma propriedade
jquery
como própria, portanto, uma abordagem melhor seria perguntar no protótipo e garantir que o objeto não sejanull
ou nãoundefined
Devido à coerção , a
if
declaração entrará em curto-circuito avaliando o&&
operador quandoobj
alguma das Falsas valores (null
,undefined
,false
,0
,""
), e então começa a executar as outras validações.Finalmente, podemos escrever uma função utilitária:
Vamos dar uma olhada em: Operadores lógicos e verdade / falsidade
fonte
||
um desses'jquery' in Object(obj)
itens, ele será drenado, porque não impedirá que objetos não-jQuery com essa propriedade passem na verificação. Porém, acredito que verificar essa propriedade no protótipo melhora a situação. Talvez você deva adicionar isso à sua resposta! Eu não acho que nenhuma outra resposta aqui mencione essa possibilidade :)obj.__proto__.jquery
vez de oobj.constructor.prototype.jquery
suficiente? apenas um pouco curto :)constructor.prototype
porqueobj
é suposto ser uma instância do construtor, ou sejajQuery
. Por outro lado,__proto__
está disponível para qualquer tipo de objeto.fonte
nodeType
da propriedade, e assegurar umboolean
valor ser devolvido, você pode usar dupla negação!!(el && el.nodeType)
No entanto, há mais uma maneira de verificar o objeto no jQuery.
Eu fiz exemplo para entender as coisas, jsfiddle link
fonte
Para aqueles que desejam saber se um objeto é um objeto jQuery sem ter o jQuery instalado, o seguinte snippet deve fazer o trabalho:
fonte
Você pode verificar se o objeto é produzido pelo JQuery com a
jquery
propriedade:=> retorna o número da versão do JQuery se o objeto produzido pelo JQuery. => caso contrário, ele retorna
undefined
fonte
fonte