【发布时间】:2010-09-28 21:24:39
【问题描述】:
有没有办法检查某个插件是否可用?
假设您正在开发一个依赖于正在加载的另一个插件的插件。
例如,我希望 jQuery 验证插件使用 dateJS 库来检查给定日期是否有效。如果 dateJS 可用,在 jQuery Valdation 插件中检测的最佳方法是什么?
【问题讨论】:
标签: jquery jquery-plugins
有没有办法检查某个插件是否可用?
假设您正在开发一个依赖于正在加载的另一个插件的插件。
例如,我希望 jQuery 验证插件使用 dateJS 库来检查给定日期是否有效。如果 dateJS 可用,在 jQuery Valdation 插件中检测的最佳方法是什么?
【问题讨论】:
标签: jquery jquery-plugins
一般来说,jQuery 插件是 jQuery 范围内的命名空间。您可以运行一个简单的检查来查看命名空间是否存在:
if(jQuery().pluginName) {
//run plugin dependent code
}
dateJs 然而不是一个 jQuery 插件。它修改/扩展 javascript 日期对象,并且不作为 jQuery 命名空间添加。您可以检查您需要的方法是否存在,例如:
if(Date.today) {
//Use the dateJS today() method
}
但您可能会遇到 API 与原生 Date API 重叠的问题。
【讨论】:
if ($.isFunction(jQuery.fn.pluginName)) { ... } 也将确保它至少是一个函数。
window.jQuery没有设置回调将没有运行,它工作正常,但现在我正在尝试加载 aj 查询插件并检查它,我需要调用 jquery 选择函数,如 jQuery().pluginName,但是当我传递它时,我的函数参数如 LoadScript("jquery+plugin.js",jquery().plugin) jquery() 不存在还
如果我们谈论的是一个合适的 jQuery 插件(一个扩展 fn 命名空间的插件),那么检测插件的正确方法是:
if(typeof $.fn.pluginname !== 'undefined') { ... }
或者因为几乎可以保证每个插件都有一些等于 true 的值,所以您可以使用较短的
if ($.fn.pluginname) { ... }
顺便说一句,$ 和 jQuery 是可以互换的,就像插件周围看起来很奇怪的包装器所展示的那样:
(function($) {
//
})(jQuery))
关闭
(function($) {
//
})
紧随其后的是对该闭包“传递”jQuery作为参数的调用
(jQuery)
闭包中的 $ 设置为等于 jQuery
【讨论】:
function isPluginLoaded(plugin) { return !!$.fn[plugin] }
if(typeof $.fn.pluginname != 'undefined')
$ 和 jQuery 不是总是可互换的,因为 jQuery 可以(例如在 WordPress 中)加载到 no-conflict mode 中。这导致我总是使用速记、无冲突安全文档:jQuery(function($) { // $ is safe in here.... });,或者,正如您所指出的,关闭模式:(function($) { // $ is safe in here.... })(jQuery);,这取决于我的心情/需要。 (顺便说一句,赞成,因为您推荐的支票是我更喜欢的支票)
为了检测 jQuery 插件,我发现使用括号更准确:
if(jQuery().pluginName) {
//run plugin dependent code
}
【讨论】:
对于不使用 fn 命名空间的插件(例如 pnotify),这是可行的:
if($.pluginname) {
alert("plugin loaded");
} else {
alert("plugin not loaded");
}
这不起作用:
if($.fn.pluginname)
【讨论】:
jQuery 有一个方法来检查某个东西是否是一个函数
if ($.isFunction($.fn.dateJS)) {
//your code using the plugin
}
【讨论】:
我强烈建议您将 DateJS 库与您的插件捆绑在一起,并记录您已经完成它的事实。没有什么比不得不寻找依赖项更令人沮丧的了。
也就是说,出于法律原因,您可能无法始终捆绑所有内容。小心谨慎并使用Eran Galperin's answer 检查插件是否存在也不会有什么坏处。
【讨论】:
在您选择的浏览器控制台中运行它。
if(jQuery().pluginName){console.log('bonjour');}
如果插件存在,它将在您的控制台中打印出“bonjour”作为响应。
【讨论】:
这种方法应该可行。
var plugin_exists = true;
try {
// some code that requires that plugin here
} catch(err) {
plugin_exists = false;
}
【讨论】: