ClientScriptManager
HTML代码表达网页的结构,CSS控制网页外观,JavaScript表达行为.
********************
自动伸展的脚本代码不能直接内嵌在标签中
**********************
在Vista等新一代平台姗姗来迟,Ajax应用异军突起的今天,对脚本的应用将大大超过以前,以组件化的思路和方式编写脚本将是大势所趋。
**************************************************************
在ASP.NET中管理脚本,正是System.Web.UI.ClientScriptManager类的特长。ClientScriptManager类通过Page.ClientScript暴露。
在控件内部,可以通过this.Page.ClientScript得到ClientScriptManager实例。
5.1.1 ClientScriptManager概述
ClientScriptManager类提供了大量生成客户端代码的方法:
— RegisterArrayDeclaration——添加一个JavaScript数组到页面中。
— RegisterClientScriptBlock——在页面的起始<form>标签后添加JavaScript脚本。
— RegisterStartScript——在页面的结束<form>标签前添加JavaScript脚本。
— RegisterClientScriptInclude——在页面的起始服务端<form>标签后添加外部JavaScript文件引用。
— RegisterClientScriptResource——添加已编译到程序集中的JavaScript资源文件的链接到页面中。
— RegisterExpandoAttribute——生成为页面中的元素附加扩展属性的脚本(由于Javascript的动态特性,所以可以为对象随意附加属性)。
— RegisterHiddenField——在页面的起始服务端<form>标签后添加一个隐藏表单域。
— RegisterOnSubmitStatement——用于添加在页面回传服务端前执行的JavaScript脚本。
— GetPostBackClientHyperLink——生成类似于javascript:__doPostBack(‘element’,’args’)的脚本,可用于完成回传服务端的链接。
— GetPostBackEventReference——以GetPostBackClientHyperLink功能类似,只是没有javascript:前缀。
— GetWebResourceUrl——生成编译到程序集中的资源文件的链接。
— RegisterForEventValidation——生成事件验证代码,事件验证指事件回传后验证参数是否来源于最初呈现这些事件的服务端控件。需要在Config文件或页面指定中指定启用EnableEventValidation。
**************************************
此外,ClientScriptManager类还有一大堆IsXXXResistered()方法,用来判断某个客户端代码是不是已经注册到了页面中。
ClientScriptManager的编程接口相当丰富,我们将在后面使用它们。
注:Page类也提供了有一些注册脚本的方法,比如:Page.RegisterClientScriptBlock(),这些方法的功能与ClientScriptManager中的同名方法类似,并且在ASP.NET 2.0中已不推荐使用。
**************************************
5.1.2 用HttpBrowserCapabilities类检验浏览器
对于很多人来说,客户端开发最大的障碍在于浏览器的兼容性。长期以来,不少人一直在为解决浏览器间的兼容问题进行着不懈努力,包括各种制定标准的组织,比如W3C,也包括各大浏览器生产厂商。但我认为兼容性问题将在很长一段时间内困扰着我们,因为虽然各种传统浏览器对标准的支持会越来越完善,但与此同时,我们要面对的浏览器种类也越来越多,千差万别的各种手机不说,还有很多你连名字都说不上的设备都需要访问因特网。
***************************************
面对这样的困境,遵循Web标准进行Web设计是基本选择,如果需要控制更多细节,ASP.NET框架也提供了支持。ASP.NET2.0新增了控件适配器(Control Adapter)对象,适配器特定于某种或某类浏览器,ASP.NET框架允许适配器截获和替换控件的关键生命周期阶段,以改变控件的呈现行为。
*************************************
适配器一般在网站级应用,如果我们需要在控件级控制呈现逻辑,可以使用HttpBrowserCapacities类检测访问浏览器,HttpBrowserCapacities类的实例通过Request.Browser属性暴露出来,在控件内部,使用this.Page.Reqeust.Browser属性可以得到包装了当前浏览器信息的HttpBrowserCapacities实例,如图5-1所示
HttpBrowserCapabilities结合User-Agent信息和browser文件中的数据
注意 在客户端检测浏览器能力有两种策略:一种方案为先检测出浏览器的类型,然后根据检测出的浏览器类型,使用适应其特点的脚本。另一种方案是每次在使用不确定的浏览器功能时,检测这种功能是不是可用。一般我们会采用第二种方案,因为它更加细腻,而且你也不必记住各种浏览器不支持哪些功能。
*********************************************
HttpBrowserCapacities类根据访问浏览器提供的HttpHeader User-Agent信息判断出浏览器的类型,然后根据配置文件中对应的浏览器兼容性信息提供丰富的编程接口:
— ActiveXControls——当浏览器支持ActiveXControl时返回true。
— Browser——返回浏览器的类型(例如IE,Firefox,Opera)。
— ClrVersion——返回安装在浏览器上的最新的.NET Framework版本。
— Cookies——当浏览器支持Cookie时返回true。
— EcmaScriptVersion——返回浏览器支持的JavaScript版本。
— MajorVersion——返回浏览器主版本的整数值。
— MinorVersion——返回浏览器副版本双精度数值。
— MinorVersionString——返回浏览器副版本字符串值。
— MSDomVersion——返回浏览器支持的Microsoft文档对象模型(DOM)版本。
— Platform——返回客户端平台(例如,WinXP)。
— SupportsCallback——当浏览器支持AJAX时返回true。
— SupportCSS——当浏览器支持层叠样式表时返回true。
— Version——返回浏览器的完整版本。
— W3CDomVersion——返回浏览器支持的W3C文档对象模型(DOM)版本(例如,1.0)。
*********************************
如果我们要检测浏览器是不是IE7,可以使用以下代码:
********************
自动伸展的脚本代码不能直接内嵌在标签中
**********************
在Vista等新一代平台姗姗来迟,Ajax应用异军突起的今天,对脚本的应用将大大超过以前,以组件化的思路和方式编写脚本将是大势所趋。
**************************************************************
在ASP.NET中管理脚本,正是System.Web.UI.ClientScriptManager类的特长。ClientScriptManager类通过Page.ClientScript暴露。
在控件内部,可以通过this.Page.ClientScript得到ClientScriptManager实例。
ClientScriptManager csm = Page.ClientScript;
csm.IsClientScriptBlockRegistered;
csm.IsStartupScriptRegistered;
***********************************csm.IsClientScriptBlockRegistered;
csm.IsStartupScriptRegistered;
5.1.1 ClientScriptManager概述
ClientScriptManager类提供了大量生成客户端代码的方法:
— RegisterArrayDeclaration——添加一个JavaScript数组到页面中。
— RegisterClientScriptBlock——在页面的起始<form>标签后添加JavaScript脚本。
— RegisterStartScript——在页面的结束<form>标签前添加JavaScript脚本。
— RegisterClientScriptInclude——在页面的起始服务端<form>标签后添加外部JavaScript文件引用。
function unl()
{
alert('in function');//不会触发
}
alert('d');
{
alert('in function');//不会触发
}
alert('d');
protected void Page_Load(object sender, EventArgs e)
{
ClientScriptManager csm = Page.ClientScript;
Type t = this.GetType();
csm.RegisterClientScriptInclude("key1", "js/script1.js");
}
{
ClientScriptManager csm = Page.ClientScript;
Type t = this.GetType();
csm.RegisterClientScriptInclude("key1", "js/script1.js");
}
— RegisterClientScriptResource——添加已编译到程序集中的JavaScript资源文件的链接到页面中。
— RegisterExpandoAttribute——生成为页面中的元素附加扩展属性的脚本(由于Javascript的动态特性,所以可以为对象随意附加属性)。
— RegisterHiddenField——在页面的起始服务端<form>标签后添加一个隐藏表单域。
— RegisterOnSubmitStatement——用于添加在页面回传服务端前执行的JavaScript脚本。
— GetPostBackClientHyperLink——生成类似于javascript:__doPostBack(‘element’,’args’)的脚本,可用于完成回传服务端的链接。
— GetPostBackEventReference——以GetPostBackClientHyperLink功能类似,只是没有javascript:前缀。
— GetWebResourceUrl——生成编译到程序集中的资源文件的链接。
— RegisterForEventValidation——生成事件验证代码,事件验证指事件回传后验证参数是否来源于最初呈现这些事件的服务端控件。需要在Config文件或页面指定中指定启用EnableEventValidation。
**************************************
此外,ClientScriptManager类还有一大堆IsXXXResistered()方法,用来判断某个客户端代码是不是已经注册到了页面中。
ClientScriptManager的编程接口相当丰富,我们将在后面使用它们。
注:Page类也提供了有一些注册脚本的方法,比如:Page.RegisterClientScriptBlock(),这些方法的功能与ClientScriptManager中的同名方法类似,并且在ASP.NET 2.0中已不推荐使用。
**************************************
5.1.2 用HttpBrowserCapabilities类检验浏览器
对于很多人来说,客户端开发最大的障碍在于浏览器的兼容性。长期以来,不少人一直在为解决浏览器间的兼容问题进行着不懈努力,包括各种制定标准的组织,比如W3C,也包括各大浏览器生产厂商。但我认为兼容性问题将在很长一段时间内困扰着我们,因为虽然各种传统浏览器对标准的支持会越来越完善,但与此同时,我们要面对的浏览器种类也越来越多,千差万别的各种手机不说,还有很多你连名字都说不上的设备都需要访问因特网。
***************************************
面对这样的困境,遵循Web标准进行Web设计是基本选择,如果需要控制更多细节,ASP.NET框架也提供了支持。ASP.NET2.0新增了控件适配器(Control Adapter)对象,适配器特定于某种或某类浏览器,ASP.NET框架允许适配器截获和替换控件的关键生命周期阶段,以改变控件的呈现行为。
*************************************
适配器一般在网站级应用,如果我们需要在控件级控制呈现逻辑,可以使用HttpBrowserCapacities类检测访问浏览器,HttpBrowserCapacities类的实例通过Request.Browser属性暴露出来,在控件内部,使用this.Page.Reqeust.Browser属性可以得到包装了当前浏览器信息的HttpBrowserCapacities实例,如图5-1所示
HttpBrowserCapabilities结合User-Agent信息和browser文件中的数据
注意 在客户端检测浏览器能力有两种策略:一种方案为先检测出浏览器的类型,然后根据检测出的浏览器类型,使用适应其特点的脚本。另一种方案是每次在使用不确定的浏览器功能时,检测这种功能是不是可用。一般我们会采用第二种方案,因为它更加细腻,而且你也不必记住各种浏览器不支持哪些功能。
*********************************************
HttpBrowserCapacities类根据访问浏览器提供的HttpHeader User-Agent信息判断出浏览器的类型,然后根据配置文件中对应的浏览器兼容性信息提供丰富的编程接口:
— ActiveXControls——当浏览器支持ActiveXControl时返回true。
— Browser——返回浏览器的类型(例如IE,Firefox,Opera)。
— ClrVersion——返回安装在浏览器上的最新的.NET Framework版本。
— Cookies——当浏览器支持Cookie时返回true。
— EcmaScriptVersion——返回浏览器支持的JavaScript版本。
— MajorVersion——返回浏览器主版本的整数值。
— MinorVersion——返回浏览器副版本双精度数值。
— MinorVersionString——返回浏览器副版本字符串值。
— MSDomVersion——返回浏览器支持的Microsoft文档对象模型(DOM)版本。
— Platform——返回客户端平台(例如,WinXP)。
— SupportsCallback——当浏览器支持AJAX时返回true。
— SupportCSS——当浏览器支持层叠样式表时返回true。
— Version——返回浏览器的完整版本。
— W3CDomVersion——返回浏览器支持的W3C文档对象模型(DOM)版本(例如,1.0)。
*********************************
如果我们要检测浏览器是不是IE7,可以使用以下代码:
if (Page.Request.Browser.Browser == "IE" && Page.Request.Browser.MajorVersion > 6)
{
this.IsIE7 = true;
}
{
this.IsIE7 = true;
}
注:浏览器兼容数据保存在\WINDOWS\Microsoft.NET\Framework\[version]\CONFIG\Browsers目录下,HttpBrowserCapabilities类的正确性依赖于这些数据的正确性,以及浏览器提交的User-Agent数据的正确性,所以它还是比较脆弱的。比如碰到像移动过滤User-Agent信息之类的情况,HttpBrowserCapabilities类只能无能为力了。
在了解了ClientScriptManager和HttpBrowserCapabilities这两个类之后,就可以开始步入探索客户端功能之旅了。