2011-03-10 87 views
1

我正在爲我的網站使用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

回答

4

您添加這些功能jQuery.fn應在選定的元素上運行,例如$('div').yourFunction()

如果你想要一個「通用」功能,如$.ajax(),那麼你應該把它添加到jQuery對象,就像你已經做的那樣。但我會用$裏面的功能:

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

})(jQuery); 

所以這取決於你想要什麼樣的功能。

+1

但是,這種模式不僅僅將jQuery對象用作命名空間嗎?在這種情況下,我寧願定義我自己的名稱空間對象,以避免與jQuery內置函數發生衝突。 – 2011-03-10 18:43:51

2

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://stackoverflow.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

0

通常插件在fn namspace上返回一個jQuery對象來保持鏈接性。它們也適用於jQuery.prototype,所有jQuery對象都可以調用它。

退房這個網頁,插件開發一個很好的概述:http://docs.jquery.com/Plugins/Authoring