从外部的js文件中获取ASPX页面的控件ClientID(get control reference from external javascript)...

前言

当使用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代码:

 

ContractedBlock.gifExpandedBlockStart.gifDefault5.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>

 

ContractedBlock.gifExpandedBlockStart.gifJScript.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代码:

 

ContractedBlock.gifExpandedBlockStart.gifDefault5.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>

 

ContractedBlock.gifExpandedBlockStart.gifJScript.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"
;
}

 

结束语:

在上面两种方法中,也没有真正的实现aspx和js的完全解耦,所以,在js文件中,最好还是加上:

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

 

上面的方法是我常用的,今天仓促的总结了一下,希望在此能够抛砖引玉,谢谢!

转载于:https://www.cnblogs.com/blodfox777/archive/2008/10/06/1304586.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]一个老工程师给年轻工程师的忠告

[1]好好规划自己的路&#xff0c;不要跟着感觉走&#xff01;根据个人的理想决策安排&#xff0c;绝大部分人并不指望成为什么院士或教授&#xff0c;而是希望活得滋润一些&#xff0c;爽一些。那么&#xff0c;就需要慎重安排自己的轨迹。从哪个行业入手&#xff0c;逐渐对该行…

A star算法优化一

A*算法 求最优解 算法一直维护两个表: Open和Close 将起点S加入Open中将所有S可到达的点&#xff08;障碍物以及位于Close表中的点均看成不可达&#xff09;加入到Open中。将起点从Open中删去&#xff0c;并加入到Close中①从Open中删去F值最小的点Min&#xff0c;并将其加入到…

可怕!CPU暗藏了这些未公开的指令!

我们平时编程写的高级语言&#xff0c;都是经过编译器编译以后&#xff0c;变成了CPU可以执行的机器指令&#xff1a;而CPU能支持的指令&#xff0c;都在它的指令集里面了。很久以来&#xff0c;我都在思考一个问题&#xff1a;CPU有没有未公开的指令&#xff1f;或者说&#x…

在Ubuntu下运行 apt-get update命令后出现错误:

在Ubuntu下运行 apt-get update命令后出现错误: The package lists or status file could not be parsed or opened sudo rm /var/lib/apt/lists/* -vf 然后&#xff1a; sudo apt-get update #&#xff08;更新软件源&#xff09;执行安装操作 sudo apt-get upgrade#&#xff…

mvc filter 的用法

1、建个类在model里面名字随便 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using RHRSP.Web.Controllers.Common;namespace RHRSP.Web.Models {public class DemoActionAttributeFilter : ActionFilterAttr…

Sandy引擎学习笔记:摄影机

第三课程&#xff1a;如何使用摄影机&#xff1f;通过摄影机移动来使摄影的对象产生变化&#xff0c;这样会使动画变得容易。因为你不需要改变观察对象的的属性&#xff0c;只是改变摄影机的变化 package { import flash.display.Sprite; import flash.events.*; impo…

A star算法优化二

本文目的是对A*寻路算法所生成的路径进行一些人性化的调整&#xff0c;使其看起来不至于太机械化。关于A*算法的原理与实现&#xff0c;读者可以阅读其他资料&#xff0c;这里不再详细阐述。 如何写估价函数A*寻路算法本质上是一个有方向性的广度优先搜索算法&#xff0c;它使用…

格式化字符串

Format (.7, “0%”)&#xff1d;70%Format (1140, “$#,##0”)&#xff1d;$1,140Format (114, “$#,##0”)&#xff1d;$1,140字符意义&#xff1a;0 显示一数字&#xff0c;若此位置没有数字则补 0# 显示一数字&#xff0c; 若此位置没有数字则不显示% 数字乘以 100 并在右边…

CentOS下python-mysqldb安装

CentOS下python-mysqldb安装日期&#xff1a;2011-04-17 &#xff5c; 来源&#xff1a;未知 &#xff5c; 作者&#xff1a;redice &#xff5c; 869 人围观 &#xff5c; 1 人鼓掌了&#xff01;鲲鹏Web数据抓取 - 专业Web数据采集服务提供者&#xff08;1&#xff09;py…

I2C总线接上拉电阻的原因

I2C为什么要接上拉电阻&#xff1f;因为它是开漏输出。为什么是开漏输出&#xff1f;I2C协议支持多个主设备与多个从设备在一条总线上&#xff0c;如果不用开漏输出&#xff0c;而用推挽输出&#xff0c;会出现主设备之间短路的情况。所以总线一般会使用开漏输出。为什么要接上…

[转贴]使用jQuery自动缩图片 - [jQuery]

具体思路: 通过具体容器取得容器内所有图片 循环检查所有图片长宽 对超过的图重新定高度. 直接写成一个扩展好了,以后可以直接用. jquery.fn.ImageAutoSize function(width,height){ $("img",this).each(function() { var image $(this); if(i…

解决循环引用--弱引用weak_ptr

循环引用&#xff1a; 引用计数是一种便利的内存管理机制&#xff0c;但它有一个很大的缺点&#xff0c;那就是不能管理循环引用的对象。一个简单的例子如下&#xff1a; class parent; class children;typedef shared_ptr<parent> parent_ptr; typedef shared_ptr<ch…

A - Character Encoding HDU - 6397 - 方程整数解-容斥原理

A - Character Encoding HDU - 6397 思路 &#xff1a; 隔板法就是在n个元素间的&#xff08;n-1&#xff09;个空中插入k-1个板&#xff0c;可以把n个元素分成k组的方法 普通隔板法 求方程 xyz10的正整数解的个数。 添元素隔板法 求方程 xyz10的非负整数解的个数。 那么 增加…

读书笔记之何时重构(下)

因为中间看了一本其他的书&#xff0c;差不多一个月未跟新读书笔记了&#xff0c;这段时间要补补课&#xff0c;接着上一章继续说说何时重构&#xff0c;文章中很多重构的方法这里还没有说明&#xff0c;后续章节会详细的介绍这些经常使用到的重构方法&#xff0c;尽请期待&…

SQLite和MySQL数据库的区别与应用

简单来说&#xff0c;SQLITE功能简约&#xff0c;小型化&#xff0c;追求最大磁盘效率&#xff1b;MYSQL功能全面&#xff0c;综合化&#xff0c;追求最大并发效率。如果只是单机上用的&#xff0c;数据量不是很大&#xff0c;需要方便移植或者需要频繁读/写磁盘文件的话&#…

第九章 虚拟内存

物理地址和虚拟地址&#xff1a; 计算机的主存被组织成一个由M个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址&#xff08;PA&#xff09;。第一个字节地址为0&#xff0c;接下来为1&#xff0c;再接下来为2&#xff0c;依次类推。CPU访问内存的最自然方式…

Safari browser and asp.net Menu control (asp:Menu)

问题&#xff1a; asp:Menu 在Safari浏览器中显示不正常。 解决方法一&#xff1a;&#xff08;App_Browsers&#xff09; Step1: Add App_Browser Folder in application right click on project add ASP.Net Folder - App_Browsers right click on App_Browsers -- Add new…

CentOS常用到的查看系统命令

# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod…

Android HandlerThread 总结使用

Android HandlerThread 总结使用转载请标明出处&#xff1a;http://www.cnblogs.com/zhaoyanjun/p/6062880.html本文出自【赵彦军的博客】前言以前我在 【Android Handler、Loop 的简单使用】 介绍了子线程和子线程之间的通信。很明显的一点就是&#xff0c;我们要在子线程中调…

[MathType需要安装新版的MT EXtra字体]解决方法

MathType是一款强大的数学公式编辑器&#xff0c;当安装完成&#xff08;或者使用绿色版&#xff09;打开程序时&#xff0c;常常弹出缺少字体的对话框&#xff0c;如下&#xff1a; MathType需要一个新版的MT Extra&#xff08;TrueType&#xff09;字体。请重新安装MathType&…