首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

9.1.3  引发客户端代码

假定已给页面添加了代码(在Visual Studio 2005中静态添加或在服务器端代码中动态添加),接着就需要确定代码何时执行了。最简单的方式是在页面中插入一个客户端脚本块,如下所示。

<script language=’JavaScript’>

window.alert("Hello, World");

</script>

大多数浏览器都会在加载页面的过程中执行这个脚本块。在页面加载过程中,当浏览器执行到这个脚本块时,就会执行块中的代码,然后继续加载页面。

但是,在要添加客户端代码的大多数情况下,都要把这些代码关联到某个客户端事件上(例如在用户单击按钮,在列表框中进行选择,离开文本框时,在浏览器上执行代码)。对于下面的讨论,假定例程SayHello已经用静态或动态方式添加到页面上,该例程只是调用了一个函数。

<script language='JavaScript'>

function SayHello()

  {window.alert("Hello, World");}

</script>

代码是函数的一部分,所以不能在页面加载过程中执行。要执行SayHello例程,必须把它关联到某个客户端事件中。在服务器端代码上,可以选择执行该例程的客户端事件。

对于从服务器端WebForm控件中生成的HTML控件,大多数事件都不直接显示在ASP.NET对象模型上。但这有一个例外:按钮的onclick事件。要把客户端例程关联到按钮的onclick事件上,只需把按钮的OnClientClick事件设置为客户端例程名,例如下面CreateChildControls方法中的Visual Basic 2005代码。

Protected Overrides Sub CreateChildControls()

Dim btn As New Web.UI.WebControls.Button

  btn.ID = "MyButton"

  btn.Text = "Hello, World"

  btn.OnClientClick = "SayHello();"

  Me.Controls.Add(btn)

End Sub

C#的对应代码如下所示。

protected override void CreateChildControls()

{

 Web.UI.WebControls.Button btn = new Web.UI.WebControls.Button();

 btn.ID = "MyButton";

 btn.Text = "Hello, World";

 btn.OnClientClick = "SayHello();";

 this.Controls.Add(btn);

}

要使用除按钮的onclick事件之外的其他事件,可以在控件的Attributes集合中添加新的事件特性。下面的Visual Basic 2005示例将onblur特性添加到文本框控件上,并把它设置为SayHello例程,从而把代码关联到文本框的客户端onblur事件上。

Dim txt As New TextBox

txt.ID = "TextBox1"

txt.Attributes("onblur") = "SayHello();"

Me.Controls.Add(txt)

C#的对应代码如下所示。

TextBox txt = new TextBox();

txt.ID = "TextBox1";

txt.Attributes["onblur"] = "SayHello();";

this.Controls.Add(txt);

如果控件不使用组成控件,就可以在控件的Render方法中使用writer对象的AddAttribute方法,把特性添加到控件上,如下面Visual Basic 2005的示例所示。

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

  writer.AddAttribute("type", "text")

  writer.AddAttribute("id", "txtName;")

  writer.AddAttribute("onblur", "SayHello();")

  writer.RenderBeginTag("input")

  writer.RenderEndTag()

End Sub

C#的对应代码如下所示。

protected override void Render(System.Web.UI.HtmlTextWriter writer)

{

  writer.AddAttribute("type", "text");

  writer.AddAttribute("id", "txtName;");

  writer.AddAttribute("onblur", "SayHello();");

  writer.RenderBeginTag("input");

  writer.RenderEndTag();

}

有了这些代码,浏览器获得的Web页面就会包含如下HTML。

<input type="text" id="txtName" onblur="SayHello();"

提示:

浏览器中引发的事件完全由控件生成的HTML控制。例如,如果自定义控件生成了HTML <span>和<div>标记,SayHello例程就不会运行—— 浏览器永远都不会为<span>和<div>标记生成onblur事件。

除了把某个代码块关联到客户端事件上之外,还可以把动态的客户端代码直接插入添加到控件的特性上。例如,下面的Visual Basic 2005代码直接把客户端代码添加到事件特性上,而不是添加一个函数调用。

Me.Attributes("onblur") = _

   "javascript:window.alert('Hello, World');"

C#的对应代码如下所示。

this.Attributes["onblur"] =

   "javascript:window.alert('Hello, World');"

将代码添加到控件的事件上,会干扰ASP.NET调用客户端验证代码的能力。如果开发人员在带有自定义控件的页面上使用验证控件,ASP.NET就会把客户端验证代码与自定义控件的客户端代码连接起来。在上述例子中,SayHello调用在最后使用的分号解决了这个问题,它可以确保SayHello调用以允许运行任何人的代码的方式连接起来。如果ASP.NET验证代码被添加到客户端代码中,结果将如下所示。

<input type="text" id="txtName"

      onblur="return SayHello();if typeof((Page_ClientValidate...

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论