從外部的js文件中獲取ASPX頁(yè)面的控件ClientID
更新時(shí)間:2009年02月17日 17:09:52 作者:
從外部的js文件中獲取ASPX頁(yè)面的控件ClientID(get control reference from external javascript)
前言
當(dāng)使用MasterPage、UserControl等容器時(shí),為了避免控件的重復(fù)命名,asp.net會(huì)自動(dòng)將容器中的控件生成一個(gè)ClientID(Control Tree中的可生成,否則不會(huì)生成)。
例如:ContentPlaceHolder1中的Button1默認(rèn)情況下會(huì)生成“ctl00_ContentPlaceHolder1_Button1”的ClientID。
我們?cè)赗ender出來(lái)的mark up中看到的也是這些ClientID。所以,當(dāng)我們使用JavaScript對(duì)控件元素進(jìn)行操作的時(shí)候,必須使用ClientID來(lái)對(duì)控件進(jìn)行查找。
Inline情況下的解決方案
如果JavaScript代碼寫在.aspx文件中時(shí),也就是Inline Script時(shí)。在頁(yè)面生成的時(shí)候,我們能夠通過(guò)綁定機(jī)制將控件的ClientID綁定到頁(yè)面Mark up中,故可使用:
document.getElementById("<%=Me.txtTest.ClientID %>" )
來(lái)獲取一個(gè)控件的真實(shí)引用,當(dāng)然,F(xiàn)indControl等方法也可以寫在<%=...%>中用來(lái)綁定服務(wù)端數(shù)據(jù)到客戶端。
external JS情況下的解決方案
然而,部分情況下,為了解耦,我們常常把JavaScript單獨(dú)寫在.js文件中,再引用到aspx文件中去。這種情況下,.js文件內(nèi)的代碼不能通過(guò)<%=...%>來(lái)進(jìn)行服務(wù)端數(shù)據(jù)的綁定,所以上面的方法是不能用的。
此時(shí)簡(jiǎn)單點(diǎn)的解決方案就是直接在JavaScript中寫控件的ClientID,但這樣增加了JS文件和ASPX的耦合度,非常不推薦使用。
我常用的方法有兩種,在此拋磚引玉:
案例:
Default5.aspx是MasterPage.master 的內(nèi)容頁(yè),本例中的主要文件。
JScript.js是一個(gè)外部的js文件,用來(lái)處理JavaScript操作。
Button1是Default5.aspx中的一個(gè)<ASP:Button>,用來(lái)顯示效果。
Button2是Default5.aspx中的一個(gè)<input type=button>,用來(lái)觸發(fā)JavaScript。
需求:點(diǎn)擊Button2,將Button1上的文本改成“from extended js”
方案一:使用內(nèi)聯(lián)JS訪問(wèn)器
要想在外部JS中獲得ASPX動(dòng)態(tài)生成的ClientID,可以通過(guò)在ASPX頁(yè)面中添加訪問(wèn)器的方式來(lái)實(shí)現(xiàn),類似OO語(yǔ)言中的屬性:
我們?cè)贒efault5.aspx中添加如下代碼:
作用:①聲明getClientId訪問(wèn)器,并注冊(cè)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>
接下來(lái),我們?cè)贘Script.js中,就可以這樣來(lái)實(shí)現(xiàn)需求:
function ChangeText()
{
var btn=document.getElementById(getClientId().Id1);
btn.value="from extended js";
}
getClientId().Id1 貌似很OO,而且還支持VS2008很蹩腳的JS智能提示,打上“.”之后就可以在提示中選擇Id1了
如果有多個(gè)控件需要注冊(cè),只需將他們注冊(cè)到訪問(wèn)器中即可,下面是一個(gè)完整的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 %>';//注冊(cè)控件1
var paraId2 = '<%= TextBox1.ClientID %>';//注冊(cè)控件2
return {Id1:paraId1,Id2:paraId2};//生成訪問(wèn)器
}
</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代碼,作為全局變量,來(lái)提供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>
接下來(lái),我們?cè)贘Script.js中,就可以這樣來(lái)實(shí)現(xiàn)需求:
function ChangeText()
{
var btn=document.getElementById(globals.controlIdentities.someControl1);
btn.value="from extended js";
}
globals.controlIdentities.someControl1,同樣,也支持VS2008很蹩腳的JS智能提示,打上“.”之后就可以在提示中選擇someControl1了
下面是一個(gè)完整的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.js
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";
}
結(jié)束語(yǔ):
在上面兩種方法中,也沒(méi)有真正的實(shí)現(xiàn)aspx和js的完全解耦,所以,在js文件中,最好還是加上:
///<reference path="Default5.aspx"/>
當(dāng)使用MasterPage、UserControl等容器時(shí),為了避免控件的重復(fù)命名,asp.net會(huì)自動(dòng)將容器中的控件生成一個(gè)ClientID(Control Tree中的可生成,否則不會(huì)生成)。
例如:ContentPlaceHolder1中的Button1默認(rèn)情況下會(huì)生成“ctl00_ContentPlaceHolder1_Button1”的ClientID。
我們?cè)赗ender出來(lái)的mark up中看到的也是這些ClientID。所以,當(dāng)我們使用JavaScript對(duì)控件元素進(jìn)行操作的時(shí)候,必須使用ClientID來(lái)對(duì)控件進(jìn)行查找。
Inline情況下的解決方案
如果JavaScript代碼寫在.aspx文件中時(shí),也就是Inline Script時(shí)。在頁(yè)面生成的時(shí)候,我們能夠通過(guò)綁定機(jī)制將控件的ClientID綁定到頁(yè)面Mark up中,故可使用:
document.getElementById("<%=Me.txtTest.ClientID %>" )
來(lái)獲取一個(gè)控件的真實(shí)引用,當(dāng)然,F(xiàn)indControl等方法也可以寫在<%=...%>中用來(lái)綁定服務(wù)端數(shù)據(jù)到客戶端。
external JS情況下的解決方案
然而,部分情況下,為了解耦,我們常常把JavaScript單獨(dú)寫在.js文件中,再引用到aspx文件中去。這種情況下,.js文件內(nèi)的代碼不能通過(guò)<%=...%>來(lái)進(jìn)行服務(wù)端數(shù)據(jù)的綁定,所以上面的方法是不能用的。
此時(shí)簡(jiǎn)單點(diǎn)的解決方案就是直接在JavaScript中寫控件的ClientID,但這樣增加了JS文件和ASPX的耦合度,非常不推薦使用。
我常用的方法有兩種,在此拋磚引玉:
案例:
Default5.aspx是MasterPage.master 的內(nèi)容頁(yè),本例中的主要文件。
JScript.js是一個(gè)外部的js文件,用來(lái)處理JavaScript操作。
Button1是Default5.aspx中的一個(gè)<ASP:Button>,用來(lái)顯示效果。
Button2是Default5.aspx中的一個(gè)<input type=button>,用來(lái)觸發(fā)JavaScript。
需求:點(diǎn)擊Button2,將Button1上的文本改成“from extended js”
方案一:使用內(nèi)聯(lián)JS訪問(wèn)器
要想在外部JS中獲得ASPX動(dòng)態(tài)生成的ClientID,可以通過(guò)在ASPX頁(yè)面中添加訪問(wèn)器的方式來(lái)實(shí)現(xiàn),類似OO語(yǔ)言中的屬性:
我們?cè)贒efault5.aspx中添加如下代碼:
作用:①聲明getClientId訪問(wèn)器,并注冊(cè)Button1的ClientID。②引用JScript.js文件
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function getClientId()
{
var paraId1 = '<%= Button1.ClientID %>';
return {Id1:paraId1};
}
</script>
<script type="text/javascript" src="JScript.js"></script>
接下來(lái),我們?cè)贘Script.js中,就可以這樣來(lái)實(shí)現(xiàn)需求:
function ChangeText()
{
var btn=document.getElementById(getClientId().Id1);
btn.value="from extended js";
}
getClientId().Id1 貌似很OO,而且還支持VS2008很蹩腳的JS智能提示,打上“.”之后就可以在提示中選擇Id1了
如果有多個(gè)控件需要注冊(cè),只需將他們注冊(cè)到訪問(wèn)器中即可,下面是一個(gè)完整的Demo代碼:
Default5.aspx
復(fù)制代碼 代碼如下:
<%@ 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 %>';//注冊(cè)控件1
var paraId2 = '<%= TextBox1.ClientID %>';//注冊(cè)控件2
return {Id1:paraId1,Id2:paraId2};//生成訪問(wèn)器
}
</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代碼,作為全局變量,來(lái)提供ClientID:
復(fù)制代碼 代碼如下:
<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>
接下來(lái),我們?cè)贘Script.js中,就可以這樣來(lái)實(shí)現(xiàn)需求:
復(fù)制代碼 代碼如下:
function ChangeText()
{
var btn=document.getElementById(globals.controlIdentities.someControl1);
btn.value="from extended js";
}
globals.controlIdentities.someControl1,同樣,也支持VS2008很蹩腳的JS智能提示,打上“.”之后就可以在提示中選擇someControl1了
下面是一個(gè)完整的Demo代碼:
Default5.aspx
復(fù)制代碼 代碼如下:
<%@ 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.js
復(fù)制代碼 代碼如下:
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";
}
結(jié)束語(yǔ):
在上面兩種方法中,也沒(méi)有真正的實(shí)現(xiàn)aspx和js的完全解耦,所以,在js文件中,最好還是加上:
///<reference path="Default5.aspx"/>
相關(guān)文章
在Code First模式中自動(dòng)創(chuàng)建Entity模型
這篇文章介紹了在Code First模式中自動(dòng)創(chuàng)建Entity模型的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06asp.net 利用IIS的404錯(cuò)誤將文件重寫成目錄的簡(jiǎn)單方法
為什么要把文件重寫成目錄,主要原因是討好搜索引擎,至于為什么寫成目錄搜索引擎就比較容易搜錄不在本文討論范圍之內(nèi)。2009-09-09ASP.NET Core 2.0 使用支付寶PC網(wǎng)站支付實(shí)現(xiàn)代碼
這篇文章主要介紹了ASP.NET Core 2.0 使用支付寶PC網(wǎng)站支付實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-10-10relaxlife.net發(fā)布一個(gè)自己開(kāi)發(fā)的中文分詞程序
relaxlife.net發(fā)布一個(gè)自己開(kāi)發(fā)的中文分詞程序...2007-03-03asp.net Reporting Service在Web Application中的應(yīng)用
由于我們這個(gè)項(xiàng)目中使用微軟的報(bào)表服務(wù)(Reporting Services)作為報(bào)表輸出工具,本人也對(duì)它進(jìn)行一點(diǎn)點(diǎn)研究,雖沒(méi)有入木三分,但這點(diǎn)知識(shí)至少可以在大部分Reporting Service的場(chǎng)景中應(yīng)用。2008-11-11Entity?Framework使用Code?First的實(shí)體繼承模式
本文詳細(xì)講解了Entity?Framework使用Code?First的實(shí)體繼承模式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Entity Framework Core更新時(shí)間映射
這篇文章介紹了Entity Framework Core更新時(shí)間映射的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03