我有一个单独页面,页面采用这样访问:test.aspx?id=1在Page_Load里面是这样写的: string sType = "";
if (!Page.IsPostBack)
{
string id = Request.QueryString["id"];
if(id.Tostring().Equals("1"))
{
Response.Write("<script>");
Response.Write("document.getElementById('showMsg').innerHTML='访问成功!';");
Response.Write("</script>");
}
} showMsg为Test.aspx里面一个id为showMsg的div元素.结果我访问的时候,出错了,提示,showMsg这个元素不存在或者为空元素。我看了一下net执行顺序,结果是先打印出script脚本,然后在加载HTML内容,导致系统找不到元素。我想知道,有那个事件是在页面HTML全部加载完毕以后,才触发的。这样这段JS代码就可以执行了
if (!Page.IsPostBack)
{
string id = Request.QueryString["id"];
if(id.Tostring().Equals("1"))
{
Response.Write("<script>");
Response.Write("document.getElementById('showMsg').innerHTML='访问成功!';");
Response.Write("</script>");
}
} showMsg为Test.aspx里面一个id为showMsg的div元素.结果我访问的时候,出错了,提示,showMsg这个元素不存在或者为空元素。我看了一下net执行顺序,结果是先打印出script脚本,然后在加载HTML内容,导致系统找不到元素。我想知道,有那个事件是在页面HTML全部加载完毕以后,才触发的。这样这段JS代码就可以执行了
客户端的ID与服务端的ID不一定相同,客户端ID往往是由一个前缀+服务端ID组成的。
Response.Write("<script>");
Response.Write("document.getElementById('showMsg').innerHTML='访问成功!';");
Response.Write("</script>");
改为:
Response.Write("<script language='JavaScript'>alert('访问成功!');</script>")OK!
resposne.write是会先被输出的。这时js执行时 document.getElementById('showMsg') 去找 showMsg 这个html元素,因为html页面尚未加载,当然就找不到了。解决办法,一般是两种方式:
(1)
<div id="showMsg">asfdafdsaf</div>
<asp:lable id="myLbl" runnat="server"/> 或者用<asp:Literal id="myLbl" runnat="server"/> 这个空件加在div后面
然后修改cs代码,把response.write改为
myLbl.text = "<script>document.getElementById('showMsg').innerHTML='访问成功!';</script>";(2)
改用
page.clientScript.RegisterStartupScript方法注册脚本代替response.write
从这里可以看出 激活Page类的Load事件 后还要经过好几个步聚才会 发送HTTP响应给客户端 即这时才输出html到浏览器。
所以response.write是在最前面的。
我在4楼的两个方法,一般常用的是方法2.
如果用方法1,那走了弯路,用方法1还不如直接把div改为服务器端html控件。