Javascript 确保jQuery插件获胜的最佳方法是什么';你从来没有覆盖过jQuery本机方法吗?
我正在编写一个jQuery插件,我想知道如何确保我永远不会覆盖未来的jQuery本机方法 例如,我的插件名为Foo,用法是Javascript 确保jQuery插件获胜的最佳方法是什么';你从来没有覆盖过jQuery本机方法吗?,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,我正在编写一个jQuery插件,我想知道如何确保我永远不会覆盖未来的jQuery本机方法 例如,我的插件名为Foo,用法是$('selector').Foo() jquery2.6已经注意到Foo的流行,并决定将其包含在核心包中。它也通过$('selector').foo()使用 我不想让我的Foo覆盖jQuery的原生Foo(或者冲突) 这就是我想到的 (function($) { // If jQuery adds this method, we don't want to overw
$('selector').Foo()
jquery2.6已经注意到Foo的流行,并决定将其包含在核心包中。它也通过$('selector').foo()使用
我不想让我的Foo覆盖jQuery的原生Foo(或者冲突)
这就是我想到的
(function($) {
// If jQuery adds this method, we don't want to overwrite it
if (typeof $.foo === 'function') {
return;
};
$.fn.foo = function() {
// Foo
};
})(jQuery);
这是最好的方法吗 您可能希望以与常规JavaScript编程类似的方式执行此操作,即使用GetElementsByCassName
函数-检查它是否存在,如果不存在,则创建它。我认为您最好使用:
if ($.foo !== undefined) {
alert('there is something at foo');
return;
};
原因是,您的插件可能如下所示:
$.foo = {
doSomething: function() { /* do something*/ },
doSomethingElse: function() { /* do something else*/ }
};
上面的类型不是函数,而是对象,因此示例中的条件不会像您预期的那样运行。您可以跳过if
语句,并在函数声明中生成定义检查
(function($){
$.fn.foo = $.fn.foo || function () {
// only used if $.fn.foo is undefined
}
})(jQuery)
稍好一点(性能方面)的版本:
如果您的foo实现与jQuery不同,那么您的插件将出现错误。。。这可能是一个很好的练习,也许我会试试:-)谢谢你的回答。也许我做错了什么,但当我发出alert($.unwrap)
即使使用jquery1.4和警报($),我也会得到未定义的
为我提供了缩小jQuery函数的toString()
。这很性感!非常感谢你的回答。我认为没有人能超越这一点。我总是忘记利用短路求值和JavaScript返回第一个truthy操作数。@alx-您应该注意这对于属性是不安全的,例如.length
,.active
,以及默认为0
的其他内容将在此处被覆盖,即使被jQuery使用,@Nick jQuery原型上也只有三个非函数属性:jQuery
、length
和选择器
。只要你不把你的插件命名为这三个插件中的任何一个,你就可以了
jQuery.fn.foo || (jQuery.fn.foo = function(){
var $ = jQuery;
(your code goes here)
});