csm2

protected void Page_Load(object sender, EventArgs e)
{
    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事件处理程序,而用后一个方法呈现页面加载完成后马上执行的代码,比如定义某个变量的初始值,对页面元素进行某种操作

 if (!Page.ClientScript.IsClientScriptBlockRegistered("HelloWorldDeclaration"))
{
 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()方法对代码是否已经注册过进行判断。在这个页面中使用这些判断并没有太大的意义,但在控件中却很有必要性,因为你不知道用户会放多少个同样的控件到页面中,如果每个控件实例都呈现一遍相同的脚本,则会在页面中产生大量冗余代码
****************************************

posted @ 2007-12-18 11:55  shuang  阅读(192)  评论(0编辑  收藏  举报