2011-08-11 100 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

安託萬