從外部的js文件中獲取ASPX頁面的控件ClientID

 

從外部的js文件中獲取ASPX頁面的控件ClientID

時間: 2008-10-06 12:21

當使用MasterPage、UserControl等容器時,爲了避免控件的重複命名,asp.net會自動將容器中的控件生成一個ClientID(Control Tree中的可生成,否則不會生成)。
例如:ContentPlaceHolder1中的Button1默認情況下會生成“ctl00_ContentPlaceHolder1_Button1”的ClientID。
我們在Render出來的mark up中看到的也是這些ClientID。所以,當我們使用JavaScript對控件元素進行操作的時候,必須使用ClientID來對控件進行查找。


Inline情況下的解決方案
如果JavaScript代碼寫在.aspx文件中時,也就是Inline Script時。在頁面生成的時候,我們能夠通過綁定機制將控件的ClientID綁定到頁面Mark up中,故可使用:
document.getElementById("<%=Me.txtTest.ClientID %>" )
來獲取一個控件的真實引用,當然,FindControl等方法也可以寫在<%=...%>中用來綁定服務端數據到客戶端。


external JS情況下的解決方案
然而,部分情況下,爲了解耦,我們常常把JavaScript單獨寫在.js文件中,再引用到aspx文件中去。這種情況下,.js文件內的代碼不能通過<%=...%>來進行服務端數據的綁定,所以上面的方法是不能用的。
此時簡單點的解決方案就是直接在JavaScript中寫控件的ClientID,但這樣增加了JS文件和ASPX的耦合度,非常不推薦使用。
我常用的方法有兩種,在此拋磚引玉:


案例:
Default5.aspx是MasterPage.master 的內容頁,本例中的主要文件。
JScript.js是一個外部的js文件,用來處理JavaScript操作。
Button1是Default5.aspx中的一個<ASP:Button>,用來顯示效果。
Button2是Default5.aspx中的一個<input type=button>,用來觸發JavaScript。
需求:點擊Button2,將Button1上的文本改成“from extended js”


方案一:使用內聯JS訪問器
要想在外部JS中獲得ASPX動態生成的ClientID,可以通過在ASPX頁面中添加訪問器的方式來實現,類似OO語言中的屬性:
我們在Default5.aspx中添加如下代碼:
作用:①聲明getClientId訪問器,並註冊Button1的ClientID。②引用JScript.js文件

 

CODE:

<script type="text/javascript">

    function getClientId()

    {

    var paraId1 = '<%= Button1.ClientID %>';

    return {Id1:paraId1};

    }

</script>

<script type="text/javascript" src="JScript.js"></script>



接下來,我們在JScript.js中,就可以這樣來實現需求:

 

CODE:

function ChangeText()

{

    var btn=document.getElementById(getClientId().Id1);

    btn.value="from extended js";

}



getClientId().Id1 貌似很OO,而且還支持VS2008很蹩腳的JS智能提示,打上“.”之後就可以在提示中選擇Id1了
如果有多個控件需要註冊,只需將他們註冊到訪問器中即可,下面是一個完整的Demo代碼:


Default5.aspx

 

CODE:

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" Title="Untitled Page" %>



<script runat="server">



</script>



<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">

<script type="text/javascript">

    function getClientId()

    {

    var paraId1 = '<%= Button1.ClientID %>';//註冊控件1

    var paraId2 = '<%= TextBox1.ClientID %>';//註冊控件2

    return {Id1:paraId1,Id2:paraId2};//生成訪問器

    }

</script>

<script type="text/javascript" src="JScript.js"></script>//引用外部js

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

    <asp:Button ID="Button1" runat="server" Text="Button" />

    <input id="Button2" type="button" value="button" onclick="ChangeText();" />

</asp:Content>





JScript.js

function ChangeText()

{

    var btn=document.getElementById(getClientId().Id1);

    btn.value="from extended js";

   

    var btn=document.getElementById(getClientId().Id2);

    btn.value="from extended js";

}



方案二:使用JS全局變量
還有一種方法也比較OO,就是使用JS全局變量,同樣,也需要在Default5.aspx中添加一段JS代碼,作爲全局變量,來提供ClientID:

 

CODE:

<script type="text/javascript"> 

    var globals = {};

    globals.controlIdentities = {};

    globals.controlIdentities.someControl1 = '<%= Button1.ClientID %>';

    globals.controlIdentities.someControl2 = '<%= TextBox1.ClientID %>';

</script>

<script type="text/javascript" src="JScript.js"></script>



接下來,我們在JScript.js中,就可以這樣來實現需求:

 

CODE:

function ChangeText()

{

    var btn=document.getElementById(globals.controlIdentities.someControl1);

    btn.value="from extended js";

}



globals.controlIdentities.someControl1,同樣,也支持VS2008很蹩腳的JS智能提示,打上“.”之後就可以在提示中選擇someControl1了
下面是一個完整的Demo代碼:

 

CODE:

JScript.j

Default5.aspx

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><%@ Page Language="C#" MasterPageFile="~/MasterPage.master" Title="Untitled Page" %>



<script runat="server">



</script>



<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">

<script type="text/javascript"> 

    var globals = {};

    globals.controlIdentities = {};

    globals.controlIdentities.someControl1 = '<%= Button1.ClientID %>';

    globals.controlIdentities.someControl2 = '<%= TextBox1.ClientID %>';

</script>

<script type="text/javascript" src="JScript.js"></script>

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

    <asp:Button ID="Button1" runat="server" Text="Button" />

    <input id="Button2" type="button" value="button" onclick="ChangeText();" />

</asp:Content>







function ChangeText()

{

    var btn=document.getElementById(globals.controlIdentities.someControl1);

    btn.value="from extended js";

   

    var txt=document.getElementById(globals.controlIdentities.someControl2);

    btn.value="from extended js";

}



結束語:
在上面兩種方法中,也沒有真正的實現aspx和js的完全解耦,所以,在js文件中,最好還是加上:

 

CODE:

///<reference path="Default5.aspx"/>



上面的方法是我常用的,今天倉促的總結了一下,希望在此能夠拋磚引玉,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章