使用通用函数扩展jquery

问题描述:

我正在为我的网站使用jquery编写一个通用函数,该函数将用于显示成功/错误消息的整个站点。我决定让它成为一个插件。使用通用函数扩展jquery

插件的简单形式下面给出:

; (function ($) { 
     jQuery.FlashMessage=function(msg){ 
      alert(msg); 
     } 

})(jQuery); 

我想知道它是否是一个很好的做法在jQuery的命名空间中定义的插件或者它应该在$ .fn.XXXX定义..或者我是否过度,并没有关系。

+3

但是你这样做,'function($)'的意义在于'$'是传递给底部匿名闭包的'jQuery'参数的内部作用域引用。因此,你应该在闭包中使用'''而不是'jQuery'。 – Alnitak 2011-03-10 18:30:31

+0

看来你不明白'$ .foo'和'$ .fn.foo'之间的区别。 – 2011-03-10 18:44:55

+0

@Sime是的,这正是他在这里问的原因! – Alnitak 2011-03-10 19:27:31

您添加这些功能jQuery.fn应在选定的元素上运行,例如$('div').yourFunction()

如果你想要一个“通用”功能,如$.ajax(),那么你应该把它添加到jQuery对象,就像你已经做的那样。但我会用$里面的功能:

(function ($) { 
     $.FlashMessage=function(msg){ 
      alert(msg); 
     } 

})(jQuery); 

所以这取决于你想要什么样的功能。

+1

但是,这种模式不仅仅将jQuery对象用作命名空间吗?在这种情况下,我宁愿定义我自己的名称空间对象,以避免与jQuery内置函数发生冲突。 – 2011-03-10 18:43:51

jQuery.fn相当于jQuery.prototype

jQuery.fn.FlashMessage你可以做

jQuery.fn.FlashMessage=function(){ 
    return this.each(function(){ 
     //do some thing 
    }); 
    }); 


//use like this, your chaining is secured  
jQuery('#someElement').FlashMessage().DoSomeThingElse().SomethingMore(); 

如果你担心被修改多为什么要使用jQuery.FlashMessage只有一个元素,做到像myNameSpace.FlashMessage

+0

不,“jQuery.fn”不等同于“jQuery.prototype”。但'jQuery.fn'是'jQuery(selector)'返回的对象的原型。 – gilly3 2011-03-10 18:46:59

+0

http://*.com/questions/1755080/why-jquery-do-this-jquery-fn-init-prototype-jquery-fn – 2011-03-10 18:50:58

+2

@gilly是的,它是。试试'jQuery.fn === jQuery.prototype'。它的评估为真。 'fn'被用作'prototype'的缩写名称。 – 2011-03-10 18:52:40

通常插件在fn namspace上返回一个jQuery对象来保持链接性。它们也适用于jQuery.prototype,所有jQuery对象都可以调用它。

退房这个网页,插件开发一个很好的概述:http://docs.jquery.com/Plugins/Authoring