3

我正在寫一個jQuery插件,我希望我的代碼能夠利用jQuery UI show(effect, [options], [speed], [callback])hide(effect, [options], [speed], [callback])函數,這些函數允許您以良好的動畫顯示和隱藏元素。如何檢查某個特定的jQuery UI功能是否可用,如果不是,請使用其他功能?

但是,如果jQuery UI不可用,我還想讓我的插件優雅地退化,切換回使用標準jQuery API中的基本非動畫show()hide()函數。

我需要特別測試顯示和隱藏功能,因爲即使jQuery UI 可用,它也可能是一個自定義版本,不包括Effects組件。

起初我還以爲我也許可以這樣做:

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

不過,當然,這並不工作,因爲即使UI不存在,show()仍然是一個函數,它只是有不同的簽名 - 所以在任何一種情況下,typeof都會返回object

那麼,我檢查jQuery UI是否可用於我的插件的最佳方式是什麼?任何幫助深表感謝!

回答

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'] : []);​ 

You can view a demo here,檢查/左取消的jQuery UI,然後單擊 「運行」 起來頂部看它在行動。這工作,因爲效果聲明如下:

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

例如,你可以看到"blind" here。我在上面的代碼中檢查$.effects$.effects.effect的原因是你只能下載some of the effects when you download jQuery UI,所以這就說明了這種可能性。

+0

太好了,謝謝 - 正是我在找的東西。我很驚訝,函數不是jQuery的一部分;這對插件作者來說必定是一個相當普遍的要求。 – 2010-06-18 08:55:07

1

尼克的功能工作完美;爲了保持一致性,我最終將其添加爲一個jQuery效用函數從我的插件代碼中:

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

所以,現在我可以打電話​​任何地方我要檢查的特定jQuery用戶界面效應的存在。

相關問題