我試圖擴展jQuery中的小部件小部件,以便它自動將某些html添加到選項卡上,新選項卡(由用戶觸發)或頁面加載(對於任何預先存在的選項卡)。通過使用常規選項卡小部件和一些自定義JavaScript函數,我能夠使所有這些工作在小部件的外部工作。但是,爲了使它更加模塊化,我希望這些函數成爲擴展小部件的成員函數。從該小部件中的.each()方法中訪問公共/私有方法的jQuery小部件
的Widget:
$.widget("custom.extendedTabs", $.ui.tabs, {
,_addOptions: function($el) {
//add a "close" button and an "options" button on each tab on mouseover
}
,_create: function() {
this.element.find("li").each(function(i,el){
this._addOptions($(this));
});
return this._super();
}
,addTab: function() {
//handle tab creation
........
this._addOptions(<newlyCreatedliElement>);
}
});
實例化:
$(".tabs").each(function(){
$(this).extendedTabs();
});
樣品:
<div id="tabs1" class="tabs">
<ul>
<li><a href="#tabs-1">Nunc tincidunt</a></li>
<li><a href="#tabs-2">Proin dolor</a></li>
</ul>
<div id="tabs-1">
<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus.</p>
</div>
<div id="tabs-2">
<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus.</p>
</div>
</div>
<div id="tabs2" class="tabs">
<ul>
<li><a href="#tabs-3">Nunc tincidunt</a></li>
</ul>
<div id="tabs-3">
<p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus.</p>
</div>
</div>
問題:
基於測試我沒有問題直接從_create()
調用this._addOptions()
。但是,從_create()
內的.each()
調用它時,我沒有同樣的成功。試圖這樣做時,我收到this.addOptions is not a function
作爲錯誤。
我知道.each()
裏面的this
表示迭代的實例元素本身,而不是調用它的父控件。但我認爲可能有某種方法可以引用名爲.each()
的對象。
UPDATE:
我是能夠成功地取代.each()
有以下幾點:
for (var el in this.element.find("li").toArray()) {
this._addOptions($(this.element.find("li").toArray()[el]));
}
感覺笨重,然而,我仍然會欣賞從別人的一些見解誰可能有清潔方法。