以前使用したことがある jquery-ui tabs
ajax
を介してページフラグメントをロードし、ページ内の非表示のdiv
sを非表示または表示する拡張機能。これらの方法はどちらも十分に文書化されており、問題はありませんでした。
しかし今、私はタブで何か違うことをしたいと思っています。ユーザーがタブを選択すると、ページが完全に再読み込みされます。これは、各タブ付きセクションのコンテンツのレンダリングにいくらか費用がかかるため、一度にすべてを送信して通常の方法を使用したくないためです。 'display:none'を切り替えて表示します。
私の計画は、タブのselect
イベントをインターセプトし、その関数でdocument.locationを操作してページをリロードすることです。
select
ハンドラーで、新しく選択したタブインデックスとそれに対応するHTML LIオブジェクトを取得するにはどうすればよいですか?
$('#edit_tabs').tabs( {
selected: 2, // which tab to start on when page loads
select: function(e, ui) {
var t = $(e.target);
// alert("data is " + t.data('load.tabs')); // undef
// alert("data is " + ui.data('load.tabs')); // undef
// This gives a numeric index...
alert( "selected is " + t.data('selected.tabs') )
// ... but it's the index of the PREVIOUSLY selected tab, not the
// one the user is now choosing.
return true;
// eventual goal is:
// ... document.location= extract-url-from(something); return false;
}
});
新しく選択したタブまたはその中のアンカータグのインデックス、ID、またはオブジェクトを提供する、読み取り可能なイベントまたはUIオブジェクトの属性はありますか?
または、タブを使用してページ全体を再読み込みするより良い方法はありますか?
タブの events を見てみましょう。以下は、jQueryドキュメントからの抜粋です。
$('.ui-tabs-nav').bind('tabsselect', function(event, ui) {
ui.options // options used to intialize this widget
ui.tab // anchor element of the selected (clicked) tab
ui.panel // element, that contains the contents of the selected (clicked) tab
ui.index // zero-based index of the selected (clicked) tab
});
Ui.tabが進むべき道のようです。
jQuery UI-v1.9.2
ui.newTab.index()
アクティブなタブのベース0インデックスを取得する
select: function(e, ui){var index=ui.index;}
私にとってはうまくいきます。参照: http://api.jqueryui.com/tabs/#events
おかげで、jobscry-あなたが指摘した 'ui.tab'はクリックされたアンカータグを私に与えました、そこからそのクラス、ID、HREFなどを抽出できます...私はURLをエンコードするためにIDを使用することを選択します。私の最後のtabs()呼び出しは次のようになります:
$(document).ready(function() {
$('#edit_tabs').tabs( {
selected: [% page.selected_tab ? page.selected_tab : 0 %],
select: function(e, ui) {
// ui.tab is an 'a' object
// it has an id of "link_foo_bar"
// transform it into http://....something&cmd=foo-bar
var url = idToTabURL(ui.tab.id);
document.location = url;
return false;
}
}).show();
});
私はこの要件を達成するための2つの方法を見つけました。ここにコードを置くのは難しいので、あなたはそれを見ることができます http://ektaraval.blogspot.com/2011/09/calling- javascript-when-jquery-ui-tab.html
それが誰かを助けることを願っています。
私の実装ではそれは次のように機能します:
$(document).ready(function() {
$('#edit_tabs').tabs( {
selected: [% page.selected_tab ? page.selected_tab : 0 %],
select: function(e, ui) {
// ui.tab is an 'a' object
var url = ui.tab.href;
document.location = url;
return false;
}
}).show();
});
または、私のWebサイトで使用した別のオプションはこれです。その基本的なUL/Divタブナビゲーションシステム。ハッシュマークが付けられた別のページへのリンクをクリックしたときに正しいタブを起動するための鍵は、ブラウザーを介して渡されたものと一致する#exampleのULをフィルターすることです。そのようです。
次にHTMLの例を示します。
<div id="tabNav">
<ul class="tabs">
<li><a href="#message">Send a message</a></li>
<li><a href="#shareFile">Share a file</a></li>
<li><a href="#arrange">Arrange a meetup</a></li>
</ul>
</div>
<div id="tabCont">
<div id="message">
<p>Lorem ipsum dolor sit amet.</p>
</div>
<div id="shareFile">
<p>Sed do eiusmod tempor incididunt.</p>
</div>
<div id="arrange">
<p>Ut enim ad minim veniam</p>
</div>
</div>
そしてそれを実現するためのjquery:
$(document).ready(function() {
$(function () {
var tabs = [];
var tabContainers = [];
$('ul.tabs a').each(function () {
// note that this only compares the pathname, not the entire url
// which actually may be required for a more terse solution.
if (this.pathname == window.location.pathname) {
tabs.Push(this);
tabContainers.Push($(this.hash).get(0));
}
});
$(tabs).click(function () {
// hide all tabs
$(tabContainers).hide().filter(this.hash).show();
// set up the selected class
$(tabs).removeClass('active');
$(this).addClass('active');
return false;
});
$(tabs).filter(window.location.hash ? '[hash=' + window.location.hash + ']' : ':first').click();
});
});
それはあなたのためにそれを世話します。私はこれが最もクリーンなコードではないことを知っていますが、それはそこにあります。
ドキュメントをざっと見て、解決策を示します。
$('#edit_tabs').tabs({ selected: 2 });
上記のステートメントは、3番目のタブをアクティブにします。