Comment puis-je vérifier si un plugin jQuery est chargé?

221

Existe-t-il un moyen de vérifier si un plugin particulier est disponible?

Imaginez que vous développez un plugin qui dépend du chargement d'un autre plugin.

Par exemple, je veux que le plugin jQuery Validation utilise la bibliothèque dateJS pour vérifier si une date donnée est valide. Quelle serait la meilleure façon de détecter, dans le plugin jQuery Valdation, si la dateJS était disponible?

Vitor Silva
la source

Réponses:

364

De manière générale, les plugins jQuery sont des espaces de noms sur la portée jQuery. Vous pouvez exécuter une simple vérification pour voir si l'espace de noms existe:

 if(jQuery().pluginName) {
     //run plugin dependent code
 }

dateJs n'est cependant pas un plugin jQuery. Il modifie / étend l'objet de date javascript et n'est pas ajouté en tant qu'espace de noms jQuery. Vous pouvez vérifier si la méthode dont vous avez besoin existe, par exemple:

 if(Date.today) {
      //Use the dateJS today() method
 }

Mais vous pourriez rencontrer des problèmes où l'API chevauche l'API Date native.

Eran Galperin
la source
63
if (jQuery.fn.pluginName) {...} est une autre option
Nagyman
6
Peut-être un peu exagéré, mais if ($.isFunction(jQuery.fn.pluginName)) { ... }garantira également qu'il s'agit au moins d'une fonction.
Noyo
j'ai une fonction qui charge le script, `LoadScript (location, namespcae, callBack)`, la fonction de rappel est déformée sous un intervalle, ce qui signifie que jusqu'à ce que l'espace de noms window.jQueryn'est pas défini, le rappel ne fonctionnera pas, cela fonctionne bien mais maintenant charger le plugin aj query et pour vérifier cela, j'ai besoin d'appeler jquery select function like jQuery().pluginName, mais quand je le passe mon paramètre de fonction comme LoadScript("jquery+plugin.js",jquery().plugin)jquery () dose n'existe pas encore
Hassan Nisar Khan
97

Si nous parlons d'un plugin jQuery approprié (celui qui étend l'espace de noms fn), alors la bonne façon de détecter le plugin serait:

if(typeof $.fn.pluginname !== 'undefined') { ... }

Ou parce que chaque plugin est à peu près garanti d'avoir une valeur équivalente à true, vous pouvez utiliser le plus court

if ($.fn.pluginname) { ... }

BTW, $ et jQuery sont interchangeables, comme le montre l'étrange wrapper autour d'un plugin:

(function($) {
    //
})(jQuery))

la fermeture

(function($) {
    //
})

est immédiatement suivi d'un appel à cette fermeture «passant» jQuery comme paramètre

(jQuery)

le $ dans la fermeture est égal à jQuery

rmirabelle
la source
2
J'ai fait une fonctionfunction isPluginLoaded(plugin) { return !!$.fn[plugin] }
styfle
2
Le premier exemple devrait êtreif(typeof $.fn.pluginname != 'undefined')
dops
1
@dops est correct et j'ai modifié la réponse en conséquence, bien que j'aie utilisé une égalité triple plutôt que double égal pour comparer à la fois le type et la valeur.
pwdst
1
$et jQueryne sont pas toujours interchangeables, car jQuery peut être (comme dans WordPress) chargé en mode sans conflit . Cela m'a amené à toujours utiliser le raccourci, un document sans conflit prêt: jQuery(function($) { // $ is safe in here.... });ou, comme vous le faites remarquer, le modèle de fermeture:, (function($) { // $ is safe in here.... })(jQuery);selon mon humeur / besoin. (BTW, voté, car le chèque que vous recommandez est celui que je préfère)
random_user_name
11

Pour détecter les plugins jQuery, j'ai trouvé plus précis d'utiliser les crochets:

if(jQuery().pluginName) {
    //run plugin dependent code
}
Suso Guez
la source
8

pour les plugins qui n'utilisent pas l'espace de noms fn (par exemple pnotify), cela fonctionne:

if($.pluginname) {
    alert("plugin loaded");
} else {
    alert("plugin not loaded");
}

Cela ne fonctionne pas:

if($.fn.pluginname)
trante
la source
Merci. Un autre exemple - Jquery Cookie plugin
ymakux
1

Je vous recommande fortement de regrouper la bibliothèque DateJS avec votre plugin et de documenter le fait que vous l'avez fait. Rien n'est plus frustrant que de devoir traquer les dépendances.

Cela dit, pour des raisons juridiques, vous ne pourrez pas toujours tout regrouper. Il n'est également jamais mauvais d'être prudent et de vérifier l'existence du plugin en utilisant la réponse d'Eran Galperin .

Soviut
la source
1

Exécutez cela dans la console de votre navigateur de choix.

if(jQuery().pluginName){console.log('bonjour');}

Si le plugin existe, il imprimera "bonjour" comme réponse dans votre console.

Joshua Pekera
la source
-1

Ce type d'approche devrait fonctionner.

var plugin_exists = true;

try {
  // some code that requires that plugin here
} catch(err) {
  plugin_exists = false;
}
ceejayoz
la source
6
Presque tenté de voter pour attraper ce que vous pouvez (et devriez) détecter facilement
pwdst