2010年3月1日 星期一

在 VS2005 整合 jQuery UI Tabs


想在 VS2005 專案裡面套用 jQuery UI 的 Tabs (頁籤)功能,於是到了 http://jqueryui.com/demos/tabs/ 去挑選了一個自己喜歡的樣式,並加入到自己的專案中。可是,當我放了一個 Button 控制項後,就開始哀號了,因為只要頁面一有 Post Back 發生,jQuery UI 就會重新載入。如上面所示,假如我已經切換到第二個頁籤(逾期未簽)後,然後點選該頁籤下的任何一個會觸發 Post Back 的動作(包括排序也一樣),jQuery UI  Tabs 就會重新跳回第一個頁籤。

所以,是不是應該偷偷放個什麼,好讓 Tabs 能夠記住目前的頁籤索引位置。

於是我在頁面上放了一個 hidden 欄位,並設定 runat="server" 。

<input type="hidden" id="hTag" runat="server" />

下一個問題,則是如何目前將頁籤的索引值寫入我的隱藏欄位 hTag ?我在 http://jqueryui.com/demos/tabs/ 的 Events 頁籤找到了 show 這個事件,測試了一下他所提供的 sample code,去攔 tabsshow 事件並加以利用。此外,抓取目前 Tabs 頁籤的方法為 .tabs('option', 'selected') ,於是將程式整理如下:

$(function(){

 // Tabs
 $('#tabs').tabs().css("width","840px");
 
 //hover states on the static widgets
 $('#dialog_link, ul#icons li').hover(
  function() { $(this).addClass('ui-state-hover'); }, 
  function() { $(this).removeClass('ui-state-hover'); }
 );
 
  $('#tabs').bind("tabsshow",function(event, ui) { GetIndex(); });
 
});

function GetIndex()
{// 將目前的 Tab Index 存入 hTag 暫存
    var $tabs = $('#tabs').tabs();
    var $tagIndex=$tabs.tabs('option', 'selected');
    $("input[id*=hTag]").val($tagIndex);   
}


程式到此,已經可以正確將目前 Tabs 頁籤切換時,將頁籤索引保存下來。但還有一個缺點,就是當頁面有 Post Back 發生時,還是沒辦法保留目前所在頁籤位置,會跳到預設的第一個。所以,需要在頁面一旦有 Post Back 時,將 Tabs 頁籤切換到目前所儲存的位置。而在 http://jqueryui.com/demos/tabs/  的 Methods 裡有提供一個 select 方法,可以切換 Tabs 頁籤,於是就可以撰寫一段程式去完成這動作。

function SyncTab()
{//如果目前的  hTag 有暫存資料,則將 Tab 與暫存資料同步   
    var $tagIndex=$("input[id*=hTag]").val();   
    
    if($tagIndex!='')
    {
        $('#tabs').tabs( 'select' , parseInt($tagIndex));
    }
}

這裡有個小地方需要注意,tabs('select', 數字參數 ) ,一定要記得傳數字參數進去,否則跳頁的效果會不正確。所以我用 parseInt( )來轉換為數字。

最後將 SyncTab() 函式放到 $(function(){ ... }) 裡面。

整個完整的 Code 如下:

<head>
<script language="javascript" type="text/javascript" src="../js/jquery.js"></script>
<script language="javascript" type="text/javascript" src="../js/jquery.url.min.js"></script>
<link type="text/css" href="../css/cupertino/jquery-ui-1.8rc2.custom.css" rel="stylesheet" /> 
<script language="javascript" type="text/javascript" src="../js/jquery-ui-tab.js"></script>


<script>
$(function(){

 // Tabs
 $('#tabs').tabs().css("width","840px");
 
 //hover states on the static widgets
 $('#dialog_link, ul#icons li').hover(
  function() { $(this).addClass('ui-state-hover'); }, 
  function() { $(this).removeClass('ui-state-hover'); }
 );
 
  $('#tabs').bind("tabsshow",function(event, ui) { GetIndex(); });
  
  //如果目前的  hTag 有暫存資料,則將 Tab 與暫存資料同步
  SyncTab();  
 
});

function GetIndex()
{// 將目前的 Tab Index 存入 hTag 暫存
    var $tabs = $('#tabs').tabs();
    var $tagIndex=$tabs.tabs('option', 'selected');
    $("input[id*=hTag]").val($tagIndex);   
}



function SyncTab()
{//如果目前的  hTag 有暫存資料,則將 Tab 與暫存資料同步   
    var $tagIndex=$("input[id*=hTag]").val();   
    
    if($tagIndex!='')
    {
        $('#tabs').tabs( 'select' , parseInt($tagIndex));
    }
}
</script>
</head>

<body>
<input type="hidden" id="hTag" runat="server" />

<div id="tabs">
 <ul>
 <li><a href="#tabs-1">逾期未填</a></li>
  <li><a href="#tabs-2">逾期未簽</a></li></ul>
 <div id="tabs-1"> Page1 Content
 </div>
 <div id="tabs-2"> Page2 Content
 </div>
</div>

</body>
 

3 則留言:

  1. 請問大大 您的TABS 是指愈期未填跟愈琦未簽
    這兩個是嗎
    請求您告訴我怎怎隱藏其中一個TABS
    那個語法是什麼
    if ($fieldsObjects['field_vroffice']->data){
    }
    else {echo $mytabs ->hiddentab("Tab2");}
    這是想要隱藏的程式碼
    如果field_vroffice有資料就沒有動作
    如果沒資料就隱藏那個TABS
    但是ELSE那邊的程式碼我不知道該打什麼
    請您告訴我
    我的信箱是paul88543@yahoo.com.tw
    感激

    回覆刪除
  2. 他沒有提供隱藏的方式,但是,你可以移除你不想要的 tab 。
    譬如說,如果你有三個 tab(tA,tB,tC),如果 tC 沒有資料且不想看到他,可以用 .tabs( "remove" , index ) 把他刪掉。
    而你的程式可以這樣寫:

    $(function() {
    $("#tabs").tabs();
    $("#tabs").tabs( "remove" , 2 )
    });

    這樣就只會看到 tA,tB 兩個頁籤了。

    參考:http://jqueryui.com/demos/tabs/#method-remove

    回覆刪除
  3. 其實你只需要在按鈕加上 .click() 時利用 __doPostBack() 就可以了:


    // 這段會把事件 Post 到 CodeBehind 處理相對應的 Button1_Click 事件
    $("#button1").click(function() {
    __doPostBack("button1", "");
    return false;
    });

    回覆刪除