Reputation: 17622
Is there any way to check if a particular plugin is available?
Imagine that you are developing a plugin that depends on another plugin being loaded.
For example I want the jQuery Validation plugin to use the dateJS library to check if a given date is valid. What would be the best way to detect, in the jQuery Valdation plugin if the dateJS was available?
Upvotes: 242
Views: 132222
Reputation: 6444
If we're talking about a proper jQuery plugin (one that extends the fn namespace), then the proper way to detect the plugin would be:
if(typeof $.fn.pluginname !== 'undefined') { ... }
Or because every plugin is pretty much guaranteed to have some value that equates to true, you can use the shorter
if ($.fn.pluginname) { ... }
BTW, the $ and jQuery are interchangable, as the odd-looking wrapper around a plugin demonstrates:
(function($) {
//
})(jQuery))
the closure
(function($) {
//
})
is followed immediately by a call to that closure 'passing' jQuery as the parameter
(jQuery)
the $ in the closure is set equal to jQuery
Upvotes: 110
Reputation: 13161
jQuery has a method to check if something is a function
if ($.isFunction($.fn.dateJS)) {
//your code using the plugin
}
API reference: https://api.jquery.com/jQuery.isFunction/
Upvotes: 2
Reputation: 525
Run this in your browser console of choice.
if(jQuery().pluginName){console.log('bonjour');}
If the plugin exists it will print out "bonjour" as a response in your console.
Upvotes: 2
Reputation: 91545
I would strongly recommend that you bundle the DateJS library with your plugin and document the fact that you've done it. Nothing is more frustrating than having to hunt down dependencies.
That said, for legal reasons, you may not always be able to bundle everything. It also never hurts to be cautious and check for the existence of the plugin using Eran Galperin's answer.
Upvotes: 1
Reputation: 34006
for the plugins that doesn't use fn namespace (for example pnotify), this works:
if($.pluginname) {
alert("plugin loaded");
} else {
alert("plugin not loaded");
}
This doesn't work:
if($.fn.pluginname)
Upvotes: 8
Reputation: 86805
Generally speaking, jQuery plugins are namespaces on the jQuery scope. You could run a simple check to see if the namespace exists:
if(jQuery().pluginName) {
//run plugin dependent code
}
dateJs however is not a jQuery plugin. It modifies/extends the javascript date object, and is not added as a jQuery namespace. You could check if the method you need exists, for example:
if(Date.today) {
//Use the dateJS today() method
}
But you might run into problems where the API overlaps the native Date API.
Upvotes: 387
Reputation: 139
To detect jQuery plugins I found more accurate to use the brackets:
if(jQuery().pluginName) {
//run plugin dependent code
}
Upvotes: 11
Reputation: 180014
This sort of approach should work.
var plugin_exists = true;
try {
// some code that requires that plugin here
} catch(err) {
plugin_exists = false;
}
Upvotes: -1