Google の功績により、jQuery UI タブの方法にはいくつかの問題があることは明らかですが.add()
、次のプロセスは (当然のことながら) 完全に信頼できるようです。
- 電話
.tabs('destroy')
- 新しいタブ (つまり、新しい
li
ノード) を「手動で」追加します。
- 再初期化
.tabs()
表面的には、これを達成するのは非常に簡単ですが、実際には、一般化された作業コードの開発にはいくつかの困難があります - 主に:
.add()
最後だけでなく、任意のインデックスにタブを挿入するネイティブ メソッドの機能を維持する必要性
- 現在選択されているタブを追跡し、再初期化後に再度選択する必要がある
- UI の全範囲の
.tabs()
オプションが引き続き利用可能であることを保証する必要性。
やりがいのあるものを書くチャンスです!
しばらくコードをいじった後、UI タブ プラグイン自体とその後のパッチまたはモンキー パッチよりも、「フィーダー」(より慣習的には「アダプター」) パターンの方が適切 (かつ単純) であるという結論に達しました。仕事をするための軽量のjQueryプラグインを思いつきました:
$.fn['tabsFeeder'] = function(options) {
this.on('addTab', function(event, url, label, index) {
var $that = $(this),
s = $that.data('tabs').options;
$that.tabs('destroy');
try {
var $lis = $that.find('li'),
n = $lis.length;
index = Math.max((index === undefined) ? n : index, 0);
$lis.eq(Math.min(index, n - 1))[(index < n) ? 'before' : 'after']('<li><a href="' + url + '">' + label + '</a></li>');
if (s.selected !== undefined && index <= s.selected) {
s.selected += 1;
}
throw ('');
}
catch (e) {
$that.tabs(s);
}
});
this.on('current', function(event, callback) {
$that = $(this);
if ($that.eq(0).length > 0 && typeof callback === 'function') {
var ui = {
'tab': $that.find('li.ui-state-active a'),
'panel': $that.find('.ui-tabs-panel').not('.ui-tabs-hide'),
'index': $that.tabs('option', 'selected')
};
callback(event, ui);
}
});
this.tabs(options);
};
私を信じてください、それは軽量です。
このプラグイン (および jQuery UI タブ) を配置すると、次のことができるようになります。
- でタブを初期化します。標準のjQuery UIタブオプション
$('selector').tabsFeeder(options)
はどこにありoptions
ますか - 追加も省略もありません
$('selector').trigger("addTab", [url, label]);
or$('selector').trigger("addTab", [url, label, index]);
の代わりに.tabs("add", url, label)
orを呼び出します.tabs("add", url, label, index)
。
そして、適切な手段としてcurrent
、現在選択されているタブへのアクセスを許可するカスタム イベントを含めました (タブのネイティブ イベントに従って「ui」オブジェクトとしてコールバック関数に配信されます)。
適切なメソッドの代わりにカスタム イベント ハンドラーを使用することを完全に正当化できるかどうかはわかりませんが、プラグインは次のようになります。
- 書きやすくなった
- より簡潔です
- 独自のデータを DOM に書き込む必要はありません。
- メソッドチェーンは保証されています
ここtabsFeeder
で実際の動作を見ることができます
欠点
tabsFeeder
は再初期化に依存しているため.tabs()
、コンテンツを再フェッチする必要がある可能性があるため、効率が悪く、おそらく ajax モードでの使用には適していません。
「addTab」イベント ハンドラーは、UI タブ プラグインのselect
イベントを使用して、現在のタブを追跡します。オプションでコールバックを指定できるようにするために、起動順序が標準コールバック (存在する場合) としてハードコードされ、その後にプラグイン(1 つの JavaScript ステートメント)select
が続くコンパクトなオブザーバーのようなパターンを選択しました。defaultSelect()
これは論理的で、デモでは正常に動作するように見えますが、完全には調査されておらず、すべてのアプリケーションで正しいとは保証できません。順序 (AB 対 BA) をプログラムで確立できるようにすることは可能ですが、これはコーディングが面倒で、おそらく必要ありません。