使用客户端脚本[4]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 hiyaolee 的 blog

1. 客户端 javascript 的结果

上面示例中一个潜在地不需要的副作用就是,警告框将会在浏览器接收到 <form> 标记后立即显示。在用户单击警告框的“ok”按钮之前,浏览器将挂起网页的呈现。这意味着用户在单击“ok”之前,将看到一个空白的浏览器页面。如果希望在显示警告框之前完全显示该页面,您可以使用 registerstartupscript 方法(我们将在下面进行讨论),在 <form> 元素的结尾处插入 javascript。

registerstartupscript(key, script)

registerstartupscript 方法与 registerclientscriptblock 方法非常相似。主要的区别在于发出客户端脚本的位置。在 <form> 元素开始后,在窗体的内容前,记住用 registerclientscriptblock 发出脚本。另一方面,registerstartupscript 在窗体的结尾 处、在所有窗体字段后,添加指定的脚本。使用 registerstartupscript 来放置与呈现的 html 元素交互的客户端脚本。(稍后我将研究根据页面加载将焦点设置到窗体字段的示例;要完成这个操作,您将要使用 registerstartupscript 方法。)

registerclientscriptblock 相似,由 registerstartupscript 添加的脚本块需要一个唯一的密钥值。同样,该密钥值主要由自定义控件开发人员使用。并不奇怪,还有一个 isstartupscriptregistered(key) 方法,它返回布尔值,表示带有指定密钥 的脚本块是否已经进行了注册。

有关使用 registerstartupscriptregisterclientscriptblock 来创建自定义编译的服务器控件的详细信息,请阅读我以前的文章: injecting client-side script from an asp.net server control.

registerarraydeclaration(arrayname, arrayvalue)

如果需要创建带有某些设置值的客户端 javascript array 对象,请使用该方法向特定的数组添加值。例如,当使用 asp.net 网页中的验证控件时,就会构建 array 对象 (page_validators),以包含对页面上验证控件集合的引用。当提交窗体时,就会枚举该数组以检查各种验证控件是否有效。

要将值 1、2 和 3 添加到名为 favoritenumbers 的客户端 array 对象,要使用以下服务器端代码:

registerarraydeclaration("favoritenumbers", "1")
registerarraydeclaration("favoritenumbers", "2")
registerarraydeclaration("favoritenumbers", "3")

这段代码会发出以下客户端脚本:

<script language="javascript">
<!--
   var favoritenumbers =  new array(1, 2, 3);
      // -->
</script>

请注意,被传递的每个数组值都必须是字符串;但是,呈现的客户端脚本将 array 对象的值设置为字符串的内容。也就是说,如果希望创建带有字符串值“scott”和“jisun”的 array,要使用以下代码:

registerarraydeclaration("favoritefolks", "'scott'")
registerarraydeclaration("favoritefolks ", "'jisun'")

请注意,第二个输入参数是包含 'scott' 和 'jisun' 的字符串 - 文本由单撇号分隔。这会显示以下客户端脚本:

<script language="javascript">
<!--
   var favoritefolks =  new array('scott', 'jisun');
      // -->
</script>

registerhiddenfield(hiddenfieldname, hiddenfieldvalue)

在传统的 asp 中,通常需要将各种信息从一个页面分发到另一个页面。完成这个操作的常用方法就是使用隐藏窗体字段。(隐藏窗体字段是不显示的窗体字段,但是它的值会根据窗体的提交而发送。创建隐藏窗体字段的语法是 。)在 asp.net 中,通过自定义隐藏窗体字段传递信息的需要会极大地减少,因为页面中的控件状态会自动保持。但是,如果您发现需要创建自定义隐藏窗体字段,可以通过 registerhiddenfield 方法来完成。

registerhiddenfield 方法接受两个输入参数。隐藏字段的名称和值。例如,要创建带有名称 foo 和值 bar 的隐藏窗体字段,请使用以下代码:

registerhiddenfield("foo", "bar")

这会在页面的 <form> 元素中添加隐藏窗体字段,如下所示:

<form name="_ctl0" method="post" action="test.aspx" id="_ctl0">
<input type="hidden" name="foo" value="bar" />
   ...
</form>

理解客户端元素是如何呈现的

page 类包含负责呈现在上面讨论的方法中注册的客户端脚本的两个 internal 方法:onformrenderonformpostrender。(标记为 internal 的方法只能被相同程序集中的其他类调用。因此,无法从 asp.net web 应用程序中的代码隐藏类调用 pageinternal 方法。)这两个方法都在 htmlform 类的 renderchildren 方法中进行调用。位于 system.web.ui.htmlcontrols 命名空间中的 htmlform 类表示 web 窗体;也就是说,asp.net 网页中的服务器端窗体<form runat="server">...</form> 在页面的实例化阶段中作为 htmlform 类的实例加载。

因为由 page 类的众多方法注册的客户端脚本是在 onformrenderonformpostrender 方法中呈现的,并且因为这些方法只能由 htmlform 类进行调用,所以通过这些方法以编程方式添加的客户端脚本,只有在网页包含 web 窗体时才会呈现。也就是说,通过上面讨论的任意方法以编程方式添加的任意脚本元素,在 asp.net 网页包含服务器端窗体(<form runat="server">...</form>)时只会在页面的最后标记中发出。

通过首先添加开始 <form> 元素,会呈现 asp.net 网页上的 web 窗体。之后,会调用 web 窗体的 renderchildren 方法,它包含三行代码:

page.onformrender(...)
mybase.renderchildren(...)
page.onformpostrender(...)

page 类的 onformrender 方法的调用会添加以下标记:

通过对 registerhiddenfield 进行调用而添加的任意隐藏窗体字段。

隐藏窗体字段中名为 __viewstate 的基于 64 位编码的视图状态。

通过对 registerclientscriptblock 进行调用而添加的任意脚本块。

web 窗体的 renderchildren 方法中的第二行代码调用基类的 renderchildren 方法,它会在 web 窗体中呈现内容。在呈现所有窗体的内容后,对 page 类的 onformpostrender 方法进行调用,这将会添加以下客户端内容:

registerarraydeclaration 方法添加的任意 array 对象。

通过对 registerstartupscript 进行调用而添加的任意脚本块。

本文关键:使用客户端脚本
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top