Como posso verificar se uma função específica da UI do jQuery está disponível e usar uma função diferente se não estiver?
-
28-09-2019 - |
Pergunta
Estou escrevendo um plugin jQuery e gostaria que meu código aproveitasse as vantagens da UI do jQuery show(effect, [options], [speed], [callback])
e hide(effect, [options], [speed], [callback])
funções, que permitem mostrar e ocultar elementos com uma bela animação.
No entanto, eu também gostaria que meu plug-in fosse degradado normalmente se o jQuery UI não estiver disponível, voltando a usar o básico e sem animação show()
e hide()
funções presentes na API jQuery padrão.
Precisarei testar especificamente as funções show e hide, mesmo que o jQuery UI é disponível, poderia ser uma versão personalizada, sem os componentes de efeitos incluídos.
No começo pensei que poderia fazer algo como:
if(typeof myelement.show('blind', 'slow') == 'undefined')
{
myelement.show('blind', 'slow');
}
else
{
myelement.show();
}
Mas é claro que isso não funciona, pois mesmo que a UI não esteja presente, show()
ainda é uma função, apenas tem uma assinatura diferente - então typeof
retorna object
em ambos os casos.
Então, qual é a melhor maneira de verificar se o jQuery UI está disponível para meu plugin?Qualquer ajuda é muito apreciada!
Solução
Você pode verificar um efeito como este:
function hasEffect(effect) {
return $.effects && $.effects[effect];
}
Então você pode usar isso em qualquer lugar:
if(hasEffect('blind')) {
myelement.show('blind', 'slow');
} else {
myElement.show();
}
//or, you can shorten it further:
//$.fn.show.apply(myelement, hasEffect('blind') ? ['blind','slow'] : []);
Você pode ver uma demonstração aqui, marque/desmarque jQuery UI à esquerda e clique em "Executar" na parte superior para vê-lo em ação.Isso funciona porque os efeitos são declarados assim:
$.effects.blind = function(o) { ...effecty stuff... };
Por exemplo, você pode ver "cego" aqui.A razão pela qual verifico ambos $.effects
e $.effects.effect
no código acima é que você só pode baixar alguns dos efeitos quando você baixa o jQuery UI, então isso explica essa possibilidade.
Outras dicas
A função de Nick funcionou perfeitamente; Para consistência, acabei adicionando -o como uma função de utilidade jQuery no meu código de plug -in:
$.extend({
hasEffect: function (effect) {
return $.effects && $.effects[effect];
}
});
Então agora eu posso ligar $.hasEffect(effectname)
Em qualquer lugar que eu queira verificar a presença de um efeito de interface do usuário do jQuery específico.