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?

StackOverflow https://stackoverflow.com/questions/3060886

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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top