csm2
{
Response.Write("<script>alert('Hello world!');</script>");
}
但是这段代码也许会让一个支持XHTML的手机浏览器死机,因这个页面最终呈现这样的客户端代码:
<script>alert('Hello world!');</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
......
由于这句代码,整个文档已经不是一个合法的xHTML文档,因为XML要求<!DOCTYPE>语句应该在文档的最前面。
回顾页面生命周期,页面的内容在执行Render()方法时呈现到客户端,它是页面生命周期中最后阶段执行的方法,远远晚于PageLoad和各个控件的回传事件,所以我们在PageLoad或ButtonClick这些事件处理程序中用Response.Write()方法输入的内容将出现在客户端代码的最前端,最终破坏整个页面结构。
***********************************
要往页面中呈现脚本,我们可以选择ClientScriptManager.RegisterClientScriptBlock()方法或ClientScriptManager.RegisterStartupScript()方法。这两个方法的参数和功能都差不多,不同之处在于它们将代码呈现在页面的不同的地方,前一个方法将客户端代码呈现在页面表单的最前面,也就是这些代码位于所有页面元素之前,这使得脚本最先被浏览器解析;后一个方法将客户端代码呈现在页面表单的最末端,页面解析这些脚本时,页面上的各种元素已经完成解析,这就使得这些脚本可以马上操作页面上的元素。
*************************************
所以我们常用前一个方法呈现一些不会马上执行的代码,比如声明某个按钮的Click事件处理程序,而用后一个方法呈现页面加载完成后马上执行的代码,比如定义某个变量的初始值,对页面元素进行某种操作
{
Page.ClientScript.RegisterClientScriptBlock(typeof(string),
"HelloWorldDeclaration",
"function sayHello(){alert('Hello world!');}", true);
}
if (!Page.ClientScript.IsStartupScriptRegistered("HelloWorldExecution"))
{
Page.ClientScript.RegisterStartupScript(typeof(string),
"HelloWorldExecution", "sayHello();", true);
}
在这段代码中,我们分别使用RegisterClientScriptBlock()方法声明sayHello()方法,用RegisterStartupScript()方法呈现执行sayHello()方法的代码,这两个方法的最后一个参数设为true,使得这两个方法将自动生成<script>标签对。
在使用这两个方法的过程中,还使用配套的IsXXXRegistered()方法对代码是否已经注册过进行判断。在这个页面中使用这些判断并没有太大的意义,但在控件中却很有必要性,因为你不知道用户会放多少个同样的控件到页面中,如果每个控件实例都呈现一遍相同的脚本,则会在页面中产生大量冗余代码。
****************************************