32

ページに「静的な」HTML がいくつかあります。

<div id="DIVISIONS">
    <ul class="nav nav-tabs" id="DIVISIONTABS">
        @* <li> nodes will be injected here by javascript *@
    </ul>
    <div class="tab-content" id="DIVISIONTABPANES">
        @* <div class="tab-pane"> nodes will be injected here by javascript *@
    </div>
</div>

ページの読み込み時に、タブ「フレームワーク」を作成します。つまり、ブートストラップ タブとタブ コンテンツ コンテナーを作成します。

次の方法でプロセスをトリガーします。

$(window).bind("load", prepareDivisionTabs);

そして、「prepareDivisionTabs」はこれを行います:

function prepareDivisionTabs() {
    // Retrieve basic data for creating tabs
    $.ajax({
        url: "@Url.Action("GetDivisionDataJson", "League")",
        cache: false
    }).done(function (data) {
        var $tabs = $('#DIVISIONTABS').empty();
        var $panes = $('#DIVISIONTABPANES').empty();
        for (var i = 0; i < data.length; i++) {
            var d = data[i];
            $tabs.append("<li><a href=\"#TABPANE" + d.DivisionId + "\" data-toggle=\"tab\">" + NMWhtmlEncode(d.Name) + "</a></li>");
            $panes.append("<div id=\"TABPANE" + d.DivisionId + "\" class=\"tab-pane\"></div>")
        }
        renderDivisionTabPaneContents(data);
    }).fail(function (err) {
        alert("AJAX error in request: " + JSON.stringify(err, null, 2));
    });
}

情報については、上記の「renderDivisionTabPaneContents」がこれを行います。

function renderDivisionTabPaneContents(data) {
    for (var i = 0; i < data.length; i++) {
        var d = data[i];
        renderDivisionTabPaneContent(d.DivisionId);
    }
}

function renderDivisionTabPaneContent(id) {
    var $tabPane = $('#TABPANE' + id);
    $tabPane.addClass("loader")
    $.ajax({
        url: "/League/GetDivisionPartialView?divisionId=" + id,
        cache: false
    }).done(function (html) {
        $tabPane.html(html);
    }).fail(function (err) {
        alert("AJAX error in request: " + JSON.stringify(err, null, 2));
    }).always(function () {
        $tabPane.removeClass("loader")
    });
}

これまでのところすべて順調です。 ページが読み込まれ、タブのコンテンツがレンダリングされ、別のタブをクリックすると、関連するコンテンツが表示されます。

ここで、最初にすべてのコンテンツをロードするのではなく、タブの「表示」イベントを使用してタブ コンテンツをジャスト イン タイムでロードしたいと考えています。これをテストするために、タブが表示されたときに JavaScript アラートを受け取ることができることを確認したかっただけです。そのため、次のように作成して、タブ表示イベントの添付をトリガーします。

$(function () {
    attachTabShownEvents();
})

これは次を呼び出します:

function attachTabShownEvents() {
    $(document).on('shown', 'a[data-toggle="tab"]', function (e) {
        alert('TAB CHANGED');
    })
}

したがって、タブの変更後に「TAB CHANGED」アラートが表示されると思います。しかし...アラートが表示されません。

誰か助けてくれませんか?

4

5 に答える 5

0

ここでブートストラップ タブを遅延ロードするために私の Nuget パッケージを使用します。これは非常に簡単です。ブートストラップ タブの「ul」要素に「lazyload」クラスを追加し、url に等しい「data-url」を追加して、任意のタブ アンカー要素 (a )。それでおしまい。

https://www.nuget.org/packages/MT.BootstrapTabsLazyLoader.js/

于 2015-06-14T10:44:25.470 に答える
0

「show」および「shown」イベントが機能しませんでした。私の解決策は、特にOPの状況ではありませんが、一般的な概念はそこにあります。

タブ(メニューボタンとコンテンツパネル)で独自のonclickイベントを強制するブートストラップで同じ問題がありました。どのメニューボタンがクリックされたかに応じてパネルに遅延読み込みしたかったのですが、現在のページにパネルを表示するボタンもあれば、iframe にページを読み込むボタンもありました。

最初は非表示のフォーム フィールド タグにデータを詰め込みましたが、これも同じ問題でした。トリックは、何らかの変化を検出し、それに対処することです。ブートストラップに触れることなく、変更を強制し、ボタンをリッスンする代替イベントを使用することで問題を解決しました。

1) iframe ターゲットをデータ属性としてボタンに隠します:

$('#btn_for_iframe').attr('data-url',iframeurl);

2) 代替イベントを発火物にバインドし、内部で iframe ソースをスワップアウトします。

$('#btn_for_iframe').on('mouseup',function(){
   console.log(this+' was activated');
   $('#iframe').attr('src',$('#btn_for_iframe').attr('data-url'));
});

3)パネルショーで「変更」イベントを強制し、iframe srcをロードします

$('#iframe_panel_wrapper').show().trigger('change');

または、上のマウスアップに変更トリガーを配置できます。

于 2015-09-22T02:43:17.987 に答える