Chinaunix
标题:
请教一个ajax使浏览器崩溃的问题
[打印本页]
作者:
hqnpc
时间:
2007-04-03 07:42
标题:
请教一个ajax使浏览器崩溃的问题
在ie7下很正常,但是在ie6进行异步操作的时候有时候会使浏览器崩溃.
怎么回事?异步代码如下:
function pollServer() {
createXMLHttpRequest();
var url = "index.php?action=main&do=updatepage";
xmlHttp.open("GET",url,true);
xmlHttp.setRequestHeader("If-Modified-Since","0");
xmlHttp.onreadystatechange = pollCallback;
//标记1 --未出现问题
xmlHttp.send(null);
}
function pollCallback() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var XMLarticles = xmlHttp.responseText;
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");
xmlDoc.loadXML(XMLarticles);
message = xmlDoc.getElementsByTagName("info");
if (message.length != 0) {
makeTable(message,xmlDoc);
}
//标记2 --出现问题1次
setTimeout("pollServer()",5000);
//标记3 --出现问题2次
}
}
}
[
本帖最后由 hqnpc 于 2007-4-4 11:02 编辑
]
作者:
HonestQiao
时间:
2007-04-03 10:38
一次操作的数据有多少?
作者:
hqnpc
时间:
2007-04-03 11:48
很少的。连kb也达不到
作者:
HonestQiao
时间:
2007-04-03 13:02
那你是否测试了,到哪一步开始崩溃呢?
作者:
hqnpc
时间:
2007-04-04 07:37
估计是 setTimeout("pollServer()",5000); 这个递归造成了浏览器崩溃,如何解决这个问题呢?
作者:
HonestQiao
时间:
2007-04-04 08:09
原帖由
hqnpc
于 2007-4-4 07:37 发表
估计是 setTimeout("pollServer()",5000); 这个递归造成了浏览器崩溃,如何解决这个问题呢?
不要估计,需要确诊才行。
怎么确诊呢?
有一个很简单地方法。
1. 你可以很简单的在页面加一个层或者input或者操作Title或者status
2. 到了某一步,就将当前的操作,反馈到1,还可以加一些计数器什么的
3. 崩溃时,不就知道到了那一步么。
作者:
hqnpc
时间:
2007-04-04 10:52
经过测试,在不同标记处都会崩溃。
在执行:
setTimeout("pollServer()",10000); 时,与执行完它到下一行处。
均会“非法操作”。
作者:
HonestQiao
时间:
2007-04-04 11:11
是立刻崩溃,还是多次之后呢?
作者:
hqnpc
时间:
2007-04-04 11:15
多次后,次数不同。 10 秒一次异步,循环次数在 60-80次间。
作者:
HonestQiao
时间:
2007-04-04 11:37
makeTable(message,xmlDoc);
这里是干什么的?
屏蔽掉,看看还会如何?
虽然我知道可能是你非要的操作。
作者:
hqnpc
时间:
2007-04-04 14:03
经过测试,当把maketable这个函数注释掉,浏览器就不会崩溃了。
函数代码如下:
注:<%$nowtime%> 这样的变量,都用于smarty
function makeTable(m_ds,xmlDoc) {
deleteOldTable(); //先清除以前的结果
var table = document.createElement("table");
table.setAttribute("border","0");
table.setAttribute("width","100%");
table.style.cssText = "padding:2px; border:1px solid #799AE1;font-size:14px"
document.body.appendChild(table);
var header = table.createTHead();
var headerrow = header.insertRow(0);
var statinfo = document.createElement('div');
var nowtime = "<%$nowtime%>";
var nowregion = "<%$nowregion%>";
var nowtype = "<%$nowtype%>";
var nowcount = "<%$nowcount%>";
var allinfo_nums = "<%$allinfo_nums%>";
var today_nums = "<%$today_nums%>";
statinfo.style.backgroundColor = 'F1F3F5';
statinfo.innerHTML = "截止 "+nowtime+" ,共有<"+nowregion+">地区{"+nowtype+"信息}"+nowcount+"条 全国今日即时信息:"+today_nums+"条 全国累计信息:"+allinfo_nums+"条";
headerrow.insertCell(0).appendChild(statinfo);
for(var i=0;i<m_ds.length;i++) {
var aid = m_ds
.getElementsByTagName("id")[0].firstChild.data;
var atype = m_ds
.getElementsByTagName("type")[0].firstChild.data;
var content = m_ds
.getElementsByTagName("content")[0].firstChild.data;
var sortname = m_ds
.getElementsByTagName("sortname")[0].firstChild.data;
var tel = m_ds
.getElementsByTagName("tel")[0].firstChild.data;
//var tel2 = m_ds
.getElementsByTagName("tel2")[0].firstChild.data;
var mobile = m_ds
.getElementsByTagName("mobile")[0].firstChild.data;
var dateline = m_ds
.getElementsByTagName("dateline")[0].firstChild.data;
<%if $userinfo.soft_contactinfo ==1%>
var contactinfo = "<font color=\"#993399\">TEL:"+tel+" "+mobile+"</font>";
<%else%>
var contactinfo = "";
<%/if%>
var row = table.insertRow(i+1);
row.style.backgroundColor = 'F1F3F5';
var eachone = document.createElement('div');
eachone.innerHTML = "<a href=\"#\" onClick=\"javascript:window.open('index.php?action=display&type="+atype+"&id="+aid+"','targetwin','width=620,height=300,scrollbars=yes,toolbar=0,location=0,directories=0,status=0,menuBar=0,resizable=1');\" ><font color=#FF8400>["+sortname+"]</font>"+content+"</a> "+contactinfo+" " +dateline+"";
eachone.style.cssText="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px";
row.insertCell(0).appendChild(eachone);
}
}
function deleteOldTable() {
delRow = document.getElementsByTagName("table").length;
if(delRow == 1) return;
var node = document.getElementsByTagName("table")[delRow-1]; //表格
var c = node.childNodes.length
for(i=0;i<c;i++){
node.removeChild(node.childNodes[0]); //删除全部单元行
}
}
[
本帖最后由 hqnpc 于 2007-4-4 14:09 编辑
]
作者:
HonestQiao
时间:
2007-04-04 14:12
那么可能是因为频繁的建立和去除DOM元素,导致崩溃。
建议这么做:
1. 我想你的数据每次都是固定的显示格式的。
2. 采用更新数据点的形式,而不是讲数据显示框架删除重建。
作者:
hqnpc
时间:
2007-04-04 14:23
可是还有还有一个问题,a用户与b用户得到的数据是不同的。
作者:
hqnpc
时间:
2007-04-05 11:27
问题果然出在频繁操作dom,换了更新数据点。问题解决了。
谢谢乔版主。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2