比如我有页面
A.aspx
b.htm
当我访问A.aspx页面的时候因为这个页面后台程序很多加载的时候就会很长一段时间显示"空白"
所以我想在打开这个页面,而后台还没有处理完的时候显示,页面正在加载中的提示然后我就在A.aspx页面的前面加上js 显示友好Div 再在页面的最后关闭这个Div
但这样还是不是我的效果
因为这样在后台加载这个页面的时候还是一片空白所以我想了另一个方法,但不知道要怎么来运用
如
访问A.aspx页面的时候
让他访问b.htm
这时因为b.htm只是一个简单的网页文件所以很快就显示出来
这个这个b.htm就显示一张正在加载中的gif
然后当A.aspx加载完成后再显示这个A.aspx本来我是想用Iframe来做的做还不做不出不知道高手们有什么方法实现我这样的效果
因为我看很多订票的网站都是这样子的PS:我这里不想用Ajax谢谢
A.aspx
b.htm
当我访问A.aspx页面的时候因为这个页面后台程序很多加载的时候就会很长一段时间显示"空白"
所以我想在打开这个页面,而后台还没有处理完的时候显示,页面正在加载中的提示然后我就在A.aspx页面的前面加上js 显示友好Div 再在页面的最后关闭这个Div
但这样还是不是我的效果
因为这样在后台加载这个页面的时候还是一片空白所以我想了另一个方法,但不知道要怎么来运用
如
访问A.aspx页面的时候
让他访问b.htm
这时因为b.htm只是一个简单的网页文件所以很快就显示出来
这个这个b.htm就显示一张正在加载中的gif
然后当A.aspx加载完成后再显示这个A.aspx本来我是想用Iframe来做的做还不做不出不知道高手们有什么方法实现我这样的效果
因为我看很多订票的网站都是这样子的PS:我这里不想用Ajax谢谢
//
else
//
用户点击 --> 服务器处理 --> 传给客户端 --> 显示出来
那么
用户点击 --> 服务器处理 --> 传给客户端 --> 显示出来
|--- 这里浏览器是空白----| |-- 这里开始显示和结束 --|然后我就想要
用户点击 --> 服务器处理 --> 传给客户端 --> 显示出来
|--- 在这里让他显示b.htm----| |-- 这里开始显示和结束 --|
if(document.readyState == "complete")
//
else
//
------------------------------------------
这页的方法是用Ajax来做的
这样很不合实际
因为每个页面在加载的地方都得用Ajax
这样对我开始来说本来一个页面的就得做两个页面
很麻烦
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack && Request.QueryString["Ajax"] == null)
{
Response.Write("<script language=\"JavaScript\">");
Response.Write(" document.write('加载中');");
Response.Write(" var xmlhttp = false;");
Response.Write(" var xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");");
Response.Write(" xmlhttp.open(\"POST\",\"Default2.aspx?Ajax=1\",true);");
Response.Write(" xmlhttp.send(null);");
Response.Write(" xmlhttp.onreadystatechange=function()");
Response.Write(" {");
Response.Write(" if ( xmlhttp.readyState==4 || xmlhttp.readyState=='complete')");
Response.Write(" {");
Response.Write(" document.write( xmlhttp.responseText);");
Response.Write(" }");
Response.Write(" }");
Response.Write("</Script>");
Response.End(); } if (!IsPostBack && Request.QueryString["Ajax"] != null)
{
System.Threading.Thread.Sleep(5000);
Response.Write("OK拉");
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write("更新了");
}
}这是我新的解决方法
可以实现我要的效果
但是
这样的就相当于多执行了一下后台程序
点浏览器的后退就是后退到"加载中"这个页面
而是不点击进来的页面谢谢
后台程序再继续处理
处理完再输出到客户端
html代码的<table>标签是要全部加载完毕才显示,而我们一般不注意的会在整个页面套一个大的<table>所以这个页面就要整个大<table>加载完了才显示
用户点击 --> 服务器处理 --> 传给客户端 --> 显示出来
在服务器处理的时候还没有传到客户端时页面的显示
{
Response.Write("<script language=\"JavaScript\">");
Response.Write(" document.write('加载中');");
Response.Write(" var xmlhttp = false;");
Response.Write(" var xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");");
Response.Write(" xmlhttp.open(\"POST\",\"Default2.aspx\",true);");
Response.Write(" xmlhttp.send(null);");
Response.Write(" xmlhttp.onreadystatechange=function()");
Response.Write(" {");
Response.Write(" if ( xmlhttp.readyState==4 || xmlhttp.readyState=='complete')");
Response.Write(" {");
Response.Write(" document.write( xmlhttp.responseText); ");
Response.Write(" }");
Response.Write(" }");
Response.Write("</Script>");
ViewState["Ajax"] = "1";
Response.End(); } if (!IsPostBack)
{
System.Threading.Thread.Sleep(5000);
Response.Write("OK拉");
}
这种方法也不行
好像xmlhttp不会取当前网页
我这样写没有效果不会触发Default2
当隐藏框架里程序处理完毕时候,调用父框架的一个js关闭div的进度层,然后使用dhtml改写父框架里面的显示数据
正常页面的代码
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
beginProgress(); for (int i = 1; i <= 100; i++)
{
setProgress(i); //此处用线程休眠代替实际的操作,如加载数据等
System.Threading.Thread.Sleep(20);
} finishProgress();
}
}
/// <summary>
///显示进度条
/// </summary> private void beginProgress()
{
//根据ProgressBar.htm显示进度条界面
string templateFileName = Path.Combine(Server.MapPath("."), "HTMLPage.htm");
StreamReader reader = new StreamReader(@templateFileName, System.Text.Encoding.GetEncoding("GB2312"));
string html = reader.ReadToEnd();
reader.Close();
Response.Write(html);
Response.Flush();
} private void setProgress(int percent)
{
string jsBlock = "<script>SetPorgressBar('" + percent.ToString() + "'); </script>";
Response.Write(jsBlock);
Response.Flush();
} private void finishProgress()
{
string jsBlock = "<script>SetCompleted();</script>";
Response.Write(jsBlock);
Response.Flush();
}
<html xmlns="http://www.w3.org/1999/xhtml" id="mainWindow">
<head>
<title>无标题页</title>
<script language="javascript" type="text/javascript">
function SetPorgressBar(pos)
{
//设置进度条居中
var screenHeight = window["mainWindow"].offsetHeight;
var screenWidth = window["mainWindow"].offsetWidth;
ProgressBarSide.style.width = Math.round(screenWidth / 4);
ProgressBarSide.style.left = Math.round(screenWidth / 3);
ProgressBarSide.style.top = Math.round(screenHeight / 2);
ProgressBarSide.style.height = "21px";
ProgressBarSide.style.display = "";//设置进度条百分比
ProgressBar.style.width = pos + "%";
ProgressText.innerHTML = "正在加载,请稍后....." + pos + "%";
}//完成后隐藏进度条
function SetCompleted()
{
ProgressBarSide.style.display = "none";
//MyTable.style.display="none"; //带上就报错,
}
</script>
</head>
<body>
<!--<div id="mydiv" style="width: 224px">数据处理中....</div>-->
<div id="ProgressBarSide" style="position:absolute;height:21px;width:100px;color:Silver;border-width:1px;border-style:Solid;display:none">
<div id="ProgressBar" style="position:absolute;height:21px;width:0%;background-color:PaleTurquoise"></div>
<div id="ProgressText" style="position:absolute;height:21px;width:100%;text-align:center"></div></div>
</body>
</html>
-------------------------------------
老大看清楚啊
用户点击 --> 服务器处理 --> 传给客户端 --> 显示出来
|--- 这里浏览器是空白----| |-- 这里开始显示和结束 --|然后我就想要
用户点击 --> 服务器处理 --> 传给客户端 --> 显示出来
|--- 在这里让他显示b.htm----| |-- 这里开始显示和结束 --|
---------------------------------------------------------------
我要的是在服务器处理的时候就已经显示一个友好的提示了
而不是服务器处理完让客户端浏览器显示的时候显示友好提示
我上面用隐藏框架的时候,写的是当客户点击时,这只是一个触发条件,你说你要在加载时,没问题啊你可以onload就提交页面,也就是说你本页完全就是一个空白页(呵呵,这样加载够快了把)<body onload="javascript:getContent();">你就在getContent里面提交到隐藏框架不成吗?
if (!IsPostBack)
{
System.Threading.Thread.Sleep(5000);
Response.Write("OK拉");
}
就这一段
那你看看在加载这个网页的时候会不会有你那个提示我要的是在网页第一次加载时 在后台处理数据的时候就在客户端显示友好提示
而不是后台处理数据完成后给客户端显示出数据的过程中显示友好提示