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) をプログラムで確立できるようにすることは可能ですが、これはコーディングが面倒で、おそらく必要ありません。