搞了很久,真的不知道怎么办了。所以把问题贴上来看看。另外请灌水和不懂的不要评论了,现在很烦躁的说,我怕看见灌水我会忍不住发飙砸键盘。谢谢!!
首先,前台的代码中有如下代码:
<input type="button" value="标记为已读" />
<div id="div_show" runat="server" style="margin-left: 40px;">
<dl>
<dd class="dd1 dd11">
<input type="checkbox" /></dd>
<dd class="dd2">
<a class="dd" href="#"><b>测试数据</b></a></dd>
<dd class="dd3">
<span class="gray_cc">2008-01-12</span></dd>
<dd class="dd3">
<a class="blue_" href="#">用户</a></dd>
<dd class="dd4">
未读</dd>
</dl>
这是前台中的一个DIV,然后我会在后台用StringBuilder拼前台的HTML元素,并且中间的数据显示是从数据库里面读取出来的,而且动态生成ChecKbox.代码如下
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
StringBuilder sbr=new StringBuilder();
sbr.Append("<div style=\"margin-left: 40px;\">");
sbr.Append("<dl>");
sbr.Append(" <dd class=\"dd1 dd11\">");
sbr.Append("<input type=\"checkbox\" name=\"Cgek_Msg\" id=\"Cgek_Msg" + dr["id"] + "\" value=\"" + dr["id"] + "\" /></dd>");
sbr.Append("<dd class=\"dd2\">");
sbr.Append(" <a class=\"dd\" href=\"#\"><b>" + dr[1].ToString() + "</b></a></dd>");
sbr.Append(" <dd class=\"dd3\">");
sbr.Append(" <span class=\"gray_cc\">" + dr[2].ToString() + "</span></dd>");
sbr.Append("<dd class=\"dd3\">");
sbr.Append(" <a class=\"blue_\" href=\"#\">" + dr[3].ToString() + "</a></dd>");
sbr.Append("<dd class=\"dd4\">未读</dd>");
sbr.Append("</dl>");
}
conn.Close();
div_show.InnerHtml = sbr.ToString();上面这段代码是在页面加载的时候就运行,也就是Load事件。但是用到AJAX,所以当我点击最上面的那个“标记为已读”的BUTTON的时候会调用JS写的doReadMsg()方法,doReadMsg()代码如下:
function doReadMsg(Chek_Id) //Chek_ID为动态生成的CheckBox的Value对应数据库的ID
{
var val="";
for(var i=0;i<Chek_Id.length;i++)
{
if(Chek_Id[i].checked==true)
val+=Chek_Id[i].value+",";
}
if(val!="")
val=val.substring(0,val.length-1);
if(val=="")
{
if(obj.checked==true)
val=obj.value;
}
var url="Default.aspx?type=2&clssId=2&val="+val;
var oRequest = getXMLHttp(); //getXMLHttp()为判断浏览器类型
oRequest.onreadystatechange=function(){
if(oRequest.readyState == 4)
{
if(oRequest .status==200)
{
$("div_show").innerHTML= oRequest.responseText;
}
}
}
}
oRequest.open("POST",url,true);
oRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
oRequest.send(null);
return false;
} 好了,问题来了。当我运行到-->
$("div_show").innerHTML= oRequest.responseText; 弹出错误信息: htmlfile :未知的运行时错误
于是我想,后台直接输出Response.Write(sbr);,但是这样子运行后,页面完全乱掉了,数据没有显示在我要它显示的地方,显示到了页面的顶端。
于是我换了一个方法。
我把$("div_show").innerHTML= oRequest.responseText;换成了:
document.write(oRequest.responseText);
是的,这样第一次点击标记为已读是没错了。但是当我点击第二次,第三次后。出现了新闻的问题。
那就是动态生成的东西会无数次的加载出现,譬如我只从数据库里面读取了三条记录,但是第二次点击后,又出现三次重复的记录,变成6条。。变成9条,每点一次加一次。
我就在已经完全不知道怎么弄了。
我不知道是不是我应该把我前台页面上所有的元素和标签之类的东西都到后台用StringBuilder拼出来,然后Response.Write();输出。还是该怎么样?
如果有谁知道这个问题,请帮我解决一下
已经从下午3点到现在这个时候都没有搞定了。拜托!请勿灌水。谢谢
首先,前台的代码中有如下代码:
<input type="button" value="标记为已读" />
<div id="div_show" runat="server" style="margin-left: 40px;">
<dl>
<dd class="dd1 dd11">
<input type="checkbox" /></dd>
<dd class="dd2">
<a class="dd" href="#"><b>测试数据</b></a></dd>
<dd class="dd3">
<span class="gray_cc">2008-01-12</span></dd>
<dd class="dd3">
<a class="blue_" href="#">用户</a></dd>
<dd class="dd4">
未读</dd>
</dl>
这是前台中的一个DIV,然后我会在后台用StringBuilder拼前台的HTML元素,并且中间的数据显示是从数据库里面读取出来的,而且动态生成ChecKbox.代码如下
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
StringBuilder sbr=new StringBuilder();
sbr.Append("<div style=\"margin-left: 40px;\">");
sbr.Append("<dl>");
sbr.Append(" <dd class=\"dd1 dd11\">");
sbr.Append("<input type=\"checkbox\" name=\"Cgek_Msg\" id=\"Cgek_Msg" + dr["id"] + "\" value=\"" + dr["id"] + "\" /></dd>");
sbr.Append("<dd class=\"dd2\">");
sbr.Append(" <a class=\"dd\" href=\"#\"><b>" + dr[1].ToString() + "</b></a></dd>");
sbr.Append(" <dd class=\"dd3\">");
sbr.Append(" <span class=\"gray_cc\">" + dr[2].ToString() + "</span></dd>");
sbr.Append("<dd class=\"dd3\">");
sbr.Append(" <a class=\"blue_\" href=\"#\">" + dr[3].ToString() + "</a></dd>");
sbr.Append("<dd class=\"dd4\">未读</dd>");
sbr.Append("</dl>");
}
conn.Close();
div_show.InnerHtml = sbr.ToString();上面这段代码是在页面加载的时候就运行,也就是Load事件。但是用到AJAX,所以当我点击最上面的那个“标记为已读”的BUTTON的时候会调用JS写的doReadMsg()方法,doReadMsg()代码如下:
function doReadMsg(Chek_Id) //Chek_ID为动态生成的CheckBox的Value对应数据库的ID
{
var val="";
for(var i=0;i<Chek_Id.length;i++)
{
if(Chek_Id[i].checked==true)
val+=Chek_Id[i].value+",";
}
if(val!="")
val=val.substring(0,val.length-1);
if(val=="")
{
if(obj.checked==true)
val=obj.value;
}
var url="Default.aspx?type=2&clssId=2&val="+val;
var oRequest = getXMLHttp(); //getXMLHttp()为判断浏览器类型
oRequest.onreadystatechange=function(){
if(oRequest.readyState == 4)
{
if(oRequest .status==200)
{
$("div_show").innerHTML= oRequest.responseText;
}
}
}
}
oRequest.open("POST",url,true);
oRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
oRequest.send(null);
return false;
} 好了,问题来了。当我运行到-->
$("div_show").innerHTML= oRequest.responseText; 弹出错误信息: htmlfile :未知的运行时错误
于是我想,后台直接输出Response.Write(sbr);,但是这样子运行后,页面完全乱掉了,数据没有显示在我要它显示的地方,显示到了页面的顶端。
于是我换了一个方法。
我把$("div_show").innerHTML= oRequest.responseText;换成了:
document.write(oRequest.responseText);
是的,这样第一次点击标记为已读是没错了。但是当我点击第二次,第三次后。出现了新闻的问题。
那就是动态生成的东西会无数次的加载出现,譬如我只从数据库里面读取了三条记录,但是第二次点击后,又出现三次重复的记录,变成6条。。变成9条,每点一次加一次。
我就在已经完全不知道怎么弄了。
我不知道是不是我应该把我前台页面上所有的元素和标签之类的东西都到后台用StringBuilder拼出来,然后Response.Write();输出。还是该怎么样?
如果有谁知道这个问题,请帮我解决一下
已经从下午3点到现在这个时候都没有搞定了。拜托!请勿灌水。谢谢
首先想问一下,你这里$()是什么东东,document.getElementById 还是Jquery or prototype中的$?你可以通过alert();先看一下oRequest.responseText有没有获取到数据,如果没有数据,那就是ajax请求有问题
看你的情况,好像是请求到数据了,只是没有显示出来,那就应该是$("div_show").innerHTML的问题
你改用document.getElementById("div_show").innerHTML试试另外,关于你提到的重复加载的问题你可以设置一个全局变量,用来记录有没有加载过,如果加载过就不用再去加载如:
var hasLoad = false;
然后在你的ajax请求成功之后,
hasLoad = true;
在doReadMsg方法中首先判断
if(hasLoad){return;}
这样就不会重复加载了