原文連結:http://www.cnblogs.com/6666/archive/2009/09/23/1572492.html從外部的js檔案中擷取ASPX頁面的控制項ClientID(get control reference from external javascript)2008-10-07 11:27當使用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檔案
<script type="text/javascript">
function getClientId()
{
var paraId1 = '<%= Button1.ClientID %>';
return {Id1:paraId1};
}
</script>
<script type="text/javascript" src="JScript.js"></script>
接下來,我們在JScript.js中,就可以這樣來實現需求:
function ChangeText()
{
var btn=document.getElementById(getClientId().Id1);
btn.value="from extended js";
}
getClientId().Id1 貌似很OO,而且還支援VS2008很蹩腳的JS智能提示,打上“.”之後就可以在提示中選擇Id1了如果有多個控制項需要註冊,只需將他們註冊到訪問器中即可,下面是一個完整的Demo代碼:Default5.aspx
<%@ 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:
<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中,就可以這樣來實現需求:
function ChangeText(){ var btn=document.getElementById(globals.controlIdentities.someControl1); btn.value="from extended js";}
globals.controlIdentities.someControl1,同樣,也支援VS2008很蹩腳的JS智能提示,打上“.”之後就可以在提示中選擇someControl1了下面是一個完整的Demo代碼:Default5.aspx
<%@ 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>JScript.jsfunction 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";}