Как я могу проверить, доступна ли конкретная функция пользовательского интерфейса jQuery, и использовать другую функцию, если ее нет? - PullRequest
3 голосов
/ 17 июня 2010

Я пишу плагин jQuery и хотел бы, чтобы в моем коде использовались функции jQuery UI show(effect, [options], [speed], [callback]) и hide(effect, [options], [speed], [callback]), которые позволяют отображать и скрывать элементы с приятной анимацией.

Однако я также хотел бы, чтобы мой плагин изящно ухудшался, если пользовательский интерфейс jQuery недоступен, переключаясь обратно на использование базовых неанимирующих функций show() и hide(), присутствующих в стандартном API jQuery. *

Мне нужно будет специально протестировать функции show и hide, так как даже если jQuery UI доступен , это может быть пользовательская версия без включенных компонентов Effects.

Сначала я подумал, что смогу сделать что-то вроде:

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

Но, конечно, это не работает, так как даже если пользовательский интерфейс отсутствует, show() все еще является функцией, он просто имеет другую сигнатуру, поэтому typeof возвращает object в любом случае.

Итак, как лучше всего проверить, доступен ли jQuery UI моему плагину? Любая помощь очень ценится!

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

Вы можете проверить эффект, подобный этому:

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 , так что это объясняет такую ​​возможность .

1 голос
/ 18 июня 2010

Функция Ника работала отлично; для согласованности я добавил его в качестве функции утилиты jQuery из кода моего плагина:

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

Так что теперь я могу позвонить $.hasEffect(effectname) куда угодно, чтобы проверить наличие определенного эффекта пользовательского интерфейса jQuery.

...