确保jQuery插件不会覆盖jQuery本机方法的最佳方法是什么?

时间:2010-11-28 09:25:33

标签: javascript jquery jquery-plugins

我正在编写一个jQuery插件,我想知道如何确保我不会覆盖未来的jQuery本机方法。

例如,我的插件名为Foo,用法为$('selector').foo()

jQuery 2.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);

这是最好的方法吗?

4 个答案:

答案 0 :(得分:8)

您可以跳过if语句并将定义检查构建到函数声明中。

(function($){

  $.fn.foo = $.fn.foo || function () {
    // only used if $.fn.foo is undefined
  }

})(jQuery)

答案 1 :(得分:2)

我认为你会更好:

  if ($.foo !== undefined) {
    alert('there is something at foo');
    return;
  };

原因是,你的插件看起来像这样:

$.foo = {
     doSomething: function() { /* do something*/ },
     doSomethingElse: function() { /* do something else*/ }
  }; 

上面的typeof 不是函数,而是对象,因此示例中的条件将不会按预期运行。

答案 2 :(得分:0)

您可能希望以类似于常规JavaScript编程getElementsByClassName函数的方式执行此操作 - 您检查它是否存在并创建它,如果不存在。

答案 3 :(得分:0)

稍微好一点(性能方面)版本:

jQuery.fn.foo || (jQuery.fn.foo = function(){
var $ = jQuery;
(your code goes here)
});