2011-08-11 53 views
4

我正在一个网站上工作。我们每1分钟要求一次新的报警。我们正在使用Javascript和c#处理程序进行该操作。 javascript部分是:页面冻结XMLHttpRequest

var url = "/myurl"; 
var xmlhttp = new XMLHttpRequest(); 
xmlhttp.open("GET", url , false); 
xmlhttp.send(); 
var xmlDoc = null; 
xmlDoc = xmlhttp.responseXML; 

可能是我的问题的原因是什么?

还有一件事。这是正确的方式吗?

回答

4

您应该使用异步代码。由于此时您的代码是同步的,因此它会在xmlhttp.send()之后暂停页面执行。

尝试类似:

var url = "/handlers/doS.ashx?id=s101"; 
var xmlhttp = new XMLHttpRequest(); 
xmlhttp.open("GET", url , true); 
xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     var xmlDoc = xmlhttp.responseXML; 
     // Do something here 
    } 
} 
xmlhttp.send(); 
2
xmlhttp.open("GET", url , false); 

你打开你的XMLHttpObject不是异步的,也就是说,是同步的。因此,该页面将冻结,直到请求url完全加载。

试试这个:

xmlhttp.open("GET", url , true); 

但是,如果你让一个异步的,你必须定义与yourXmlHttpObj.onreadystatechange回调处理程序。您可以查看Jorrit Schippers的答案以获取完整的用例。

Ajax调用在互联网上有很好的记录,我建议你在那里寻找一些文档/教程。


编辑:对于你的最后一个问题,这是不完全正确的方式,你的代码是不是跨浏览器会崩溃的一些IE版本。最好使用像jQuery框架,所以只需dothis:

$.ajax({ 
url: 'http://Whaterver.com/doc.xml', 
success: function(data) { 
    myDoc = data; 
} 
}); 
2

这可能是因为您向服务器发送一个同步调用,它正在等待回应。而是使用异步调用来获得响应:

xmlhttp.open("GET", url , true); 
3

在XMLHttpRequest的第三个参数应该是异步请求真(意味着非阻塞交易)。从MDN Documentation

报价可选布尔参数,默认设置为true,指示是否以异步方式执行该操作。如果此值为false,则send()方法不会返回,直到收到响应。

有关如何管理异步请求的示例,您应该看看there

安托万