3

我正在编写一个 jQuery 插件,我希望我的代码能够利用 jQuery UIshow(effect, [options], [speed], [callback])hide(effect, [options], [speed], [callback])函数,它们允许您显示和隐藏带有漂亮动画的元素。

但是,如果 jQuery UI 不可用,我也希望我的插件能够优雅地降级,切换回使用标准 jQuery API 中存在的基本、非动画show()和功能。hide()

我需要专门测试显示和隐藏功能,因为即使 jQuery UI可用,它也可能是自定义版本,不包括效果组件。

起初我以为我可以做类似的事情:

if(typeof myelement.show('blind', 'slow') == 'undefined')
{
    myelement.show('blind', 'slow');
}
else
{
    myelement.show();
}

但是这当然行不通,因为即使 UI 不存在,show()它仍然是一个函数,只是有不同的签名——所以在任何一种情况下typeof都会返回object

那么,我检查 jQuery UI 是否可用于我的插件的最佳方法是什么?任何帮助深表感谢!

4

2 回答 2

2

您可以检查这样的效果:

function hasEffect(effect) {
    return $.effects && $.effects[effect];
}

然后你可以在任何地方使用它:

if(hasEffect('blind')) {
  myelement.show('blind', 'slow');
} else {
  myElement.show();
}
//or, you can shorten it further:
//$.fn.show.apply(myelement, hasEffect('blind') ? ['blind','slow'] : []);​

您可以在此处查看演示,选中/取消选中左侧的 jQuery UI,然后单击顶部的“运行”以查看它的运行情况。这是有效的,因为效果是这样声明的:

$.effects.blind = function(o) { ...effecty stuff... };

例如,您可以在此处看到“盲”。我在上面的代码中检查两者的原因$.effects$.effects.effect您只能在下载 jQuery UI 时下载一些效果,所以这说明了这种可能性。

于 2010-06-17T11:29:55.377 回答
1

尼克的功能完美无缺;为了保持一致性,我最终在我的插件代码中将其添加为 jQuery 实用函数:

$.extend({
    hasEffect: function (effect) {
        return $.effects && $.effects[effect];
    }
});

所以现在我可以调用$.hasEffect(effectname)任何我想检查是否存在特定 jQuery UI 效果的地方。

于 2010-06-18T09:01:45.277 回答