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