2012-12-04 43 views
13

我正在使用jQuery v1.8.3和jQuery UI v1.9.2。我想擴展現有的jQuery UI小部件(在我的情況下是Autocomplete小部件),只需添加和覆蓋一些選項和方法,但保留其他功能與正式版本中的功能相同。我怎樣才能做到「正確」(或許是「標準」)?如何擴展現有的jQuery UI小部件?


P.S.:我在網上搜索(1,2,...),我發現文檔主要與創建一個新的 jQuery UI小部件,但不擴展現有的。

+1

定義「擴展」。根據你想要做什麼,你通常只需要添加新的方法,然後重寫一些現有的方法來利用你添加的功能。如[自動完成accentFolding擴展](https://github.com/scottgonzalez/jquery-ui-extensions/blob/master/autocomplete/jquery.ui.autocomplete.accentFolding.js)。沒有太多的清潔和麪向未來的方式。 –

+0

我認爲任何人都可以提供的唯一答案是你必須認真對待。你將不得不熟悉代碼庫,然後確保你維護任何合同功能與對方。 – thatidiotguy

+0

@FabrícioMatté - 你的意思是「沒有太多清潔和麪向未來的方式」? – user12882

回答

35

在jQuery UI 1.9+中,擴展小部件的方式與創建新小部件的方式相同。微件工廠($.widget())支撐有幾個可能性:

使用鹼微件($.Widget)爲出發點創建新的小窗口:

$.widget("ns.widget", { ... })

創建新的小部件,從現有的插件繼承:

$.widget("ns.widget", $.ns.existingWidget, { ... })

擴展一個小部件:

$.widget("ns.widget", $.ns.widget, { ... })

您會注意到擴展語法和繼承語法是相同的。這個widget工廠足夠聰明,可以注意到你正在創建的部件和你繼承的部件是相同的,並且適當地處理它。

當繼承或擴展小部件時,您只需要定義要更改或添加的內容。基礎小部件上還存在一些新的方法,以便更容易地使用改變上下文的繼承和方法。閱讀jQuery.Widget documentation以獲取完整的方法及其描述。如果你要擴展一個小部件,你一定要閱讀_super()

下面是將默認delay選項更改爲500並添加新的選項prefix被添加到所有建議的例子:

$.widget("ui.autocomplete", $.ui.autocomplete, { 
    options: { 
     delay: 500, 
     prefix: "" 
    }, 

    _renderItem: function(ul, item) { 
     var label = item.label; 
     if (this.options.prefix) { 
      label = this.options.prefix + " " + label; 
     } 
     return $("<li>") 
      .append($("<a>").text(label)) 
      .appendTo(ul); 
    }, 
}); 
+6

*擴展*和*繼承*之間的區別是什麼? – user12882

+3

繼承創建新的小部件,而不更改現有的小部件。擴展小部件會改變現有小部件的行爲,而不會創建新的小部件。 –

+1

如果它保存了與我剛纔相同的時間/頭痛的任何人,請注意,由於它不基於早期版本中的Widget工廠,因此無法擴展jQuery UI的datepicker(版本1.10或更高版本)。看到這個問題http://stackoverflow.com/questions/25011698/extending-jquery-ui-datepicker。與其他小部件,延伸應該工作正常。 – jinglesthula