从 jQuery 小部件内的 .each() 方法中访问该小部件的 public/private 方法
Accessing public/private methods of a jQuery widget from within an .each() method inside that widget
我正在尝试扩展 jQuery 中的选项卡小部件,以便它在创建新选项卡(由用户触发)或在页面上时自动将某些 html 添加到选项卡加载(对于任何预先存在的选项卡)。通过使用常规选项卡小部件和一堆自定义 javascript 函数,我能够让所有这些在小部件外部工作。但是,为了使其更加模块化,我希望这些函数成为我的扩展小部件的成员函数。
小部件:
$.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()
.
的对象
更新:
我成功地用以下内容替换了 .each()
:
for (var el in this.element.find("li").toArray()) {
this._addOptions($(this.element.find("li").toArray()[el]));
}
然而,它感觉笨拙,所以我仍然希望有人提供一些更简洁的方法。
我考虑过另一种解决方案 -- 保留 jQuery .each()
:
,_create: function() {
var self=this;
this.element.find("li").each(function(i,el){
self._addOptions($(this));
});
return this._super();
}
我正在尝试扩展 jQuery 中的选项卡小部件,以便它在创建新选项卡(由用户触发)或在页面上时自动将某些 html 添加到选项卡加载(对于任何预先存在的选项卡)。通过使用常规选项卡小部件和一堆自定义 javascript 函数,我能够让所有这些在小部件外部工作。但是,为了使其更加模块化,我希望这些函数成为我的扩展小部件的成员函数。
小部件:
$.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()
.
更新:
我成功地用以下内容替换了 .each()
:
for (var el in this.element.find("li").toArray()) {
this._addOptions($(this.element.find("li").toArray()[el]));
}
然而,它感觉笨拙,所以我仍然希望有人提供一些更简洁的方法。
我考虑过另一种解决方案 -- 保留 jQuery .each()
:
,_create: function() {
var self=this;
this.element.find("li").each(function(i,el){
self._addOptions($(this));
});
return this._super();
}