代码之家  ›  专栏  ›  技术社区  ›  alex

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

  •  8
  • alex  · 技术社区  · 14 年前

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

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

    jQuery 2.6已经注意到Foo的流行,并决定将其包含在核心包中。它也是通过 $(“选择器”).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 回复  |  直到 14 年前
        1
  •  8
  •   Adam Lassek    14 年前

    你可以跳过 if 语句并将定义签入到函数声明中。

    (function($){
    
      $.fn.foo = $.fn.foo || function () {
        // only used if $.fn.foo is undefined
      }
    
    })(jQuery)
    
        2
  •  2
  •   karim79    14 年前

    我想你最好:

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

    原因是,你的插件可能是这样的:

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

    这个 typeof 以上是 函数,但对象,因此示例中的条件将不会按预期的方式运行。

        3
  •  0
  •   Niet the Dark Absol    14 年前

    您可能希望以类似于常规JavaScript编程的方式 getElementsByClassName 函数-检查是否存在并创建它。

        4
  •  0
  •   Dennis    14 年前

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

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