前言
asp.net Ajax Control Toolkit 中的Tab控件非常簡單易用,對服務端和客戶端的支持都非常不錯。本篇通過幾個FAQ給大家介紹Tab和javaScript的常用交互,以及應該注意到的問題。
目前的Tab控件很多,而Altas的Tab控件有點在于JavaScript接口非常豐富,而且非常便于理解和使用,一般常用的有以下幾組:
get_headerText //獲取標題文字 set_headerText //設置標題文字 get_headerTab //獲取標題Tab set_headerTab //設置標題Tab get_enabled //啟用TabPanel set_enabled //禁用TabPanel get_owner //獲取TabPanel父容器 set_owner //設置TabPanel父容器 get_scrollBars //獲取滾動條狀態 set_scrollBars //設置滾動條狀態 get_tabIndex //獲取TabPanel的序號 _get_active//獲取當前活動的TabPanel _set_active//設置當前活動的TabPanel
而所有的接口可以在源代碼的Tabs.js文件中找到:
2. 常用例子
A. 獲取TabContainer當前活動的TabPanel
function GetActiveTab(tabControl) { var ctrl = $find(tabControl); var activeid = ctrl.get_activeTab().get_tabIndex(); alert(activeid); }
B. 設置TabContainer當前活動的TabPanel
function SetActiveTab(index) { var ctrl = $find("TabContainer1"); var tabpanel = ctrl.get_tabs()[index]; ctrl.set_activeTab(tabpanel); }
3. 修改Tab控件,使其支持鼠標移動激活
盡管Tab控件比較酷,也很便于使用,但它默認的事件是點擊標簽來激活一個TabPanel,而很多JavaScript Tab和一些第三方控件的Tab都是靠onmouSEOver來激活一個TabPanel。如果想要使 Tab控件通過onmouseover激活TabPanel,我們可以通過修改源代碼來實現:
//in the "Tab.js" change the “_header_onmouseover” (near the 522nd line) as following: _header_onmouseover: function(e) { Sys.UI.DomElement.addCSSClass(this._tab, "ajax__tab_hover"); this.get_owner().set_activeTab(this);//添加這一行(add this line to the original code) },
4. ClientID問題
與一般的ASP.NET服務端容器一樣,在TabPanel里的控件也會在Render的時候重命名,為其生成一個ClientID,如果需要在JavaScript中對這些控件進行操作,我們必須要獲得它們的ClientID,如下的代碼是一般的方法:
<%@ Page Language="C#" %><%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPRefix="cc1" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server"> public string tabContentTableClientID { get { return tabContentTable.ClientID; } } </script><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title> <script type="text/javascript"> function getTabsOnSuccess() { document.getElementById('<%=tabContentTableClientID%>').innerHTML = "Hello world"; } </script></head><body> <form id="form1" runat="server"> <div> <cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"> </cc1:ToolkitScriptManager> <cc1:TabContainer ID="TabContainer1" runat="server" ActiveTabIndex="0" Height="381px" Width="536px"> <cc1:TabPanel runat="server" HeaderText="TabPanel1" ID="TabPanel1"> <HeaderTemplate> TabPanel1 </HeaderTemplate> <ContentTemplate> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Panel ID="tabContentTable" runat="server"> </asp:Panel> </ContentTemplate> </cc1:TabPanel> <cc1:TabPanel runat="server" HeaderText="TabPanel2" ID="TabPanel2"> <ContentTemplate> <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> </ContentTemplate> </cc1:TabPanel> </cc1:TabContainer> <input id="Button1" type="button" value="button" onclick="getTabsOnSuccess();" /> </div> </form></body></html>
然而,如果你實驗上面的代碼,則會發現它是不work的,ClientID并沒有正確的獲得,反而產生了稀奇古怪的錯誤。
其原因是ASP.NET編譯的順序問題,由于AJAX控件是采用Sys.application.add_init()添加到頁面中的,而我們在上面例子中對ClientID的綁定在這個過程之前,所以產生了這種順序錯誤。
解決方案很簡單,就是把寫在<head></head>中的JavaScript代碼寫到body的末尾,這樣,可以確保能夠在JavaScript代碼中的ClientID綁定時,Tab已經成功添加到頁面Control Tree,從而解決問題:
<%@ Page Language="C#" %><%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server"> public string tabContentTableClientID { get { return tabContentTable.ClientID; } } </script><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title></head><body> <form id="form1" runat="server"> <div> <cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"> </cc1:ToolkitScriptManager> <cc1:TabContainer ID="TabContainer1" runat="server" ActiveTabIndex="0" Height="381px" Width="536px"> <cc1:TabPanel runat="server" HeaderText="TabPanel1" ID="TabPanel1"> <HeaderTemplate> TabPanel1 </HeaderTemplate> <ContentTemplate> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Panel ID="tabContentTable" runat="server"> </asp:Panel> </ContentTemplate> </cc1:TabPanel> <cc1:TabPanel runat="server" HeaderText="TabPanel2" ID="TabPanel2"> <ContentTemplate> <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> </ContentTemplate> </cc1:TabPanel> </cc1:TabContainer> <input id="Button1" type="button" value="button" onclick="getTabsOnSuccess();" /> </div> </form> <script type="text/javascript"> function getTabsOnSuccess() { document.getElementById('<%=tabContentTableClientID%>').innerHTML = "Hello world"; } </script></body></html>