2012-01-15 99 views
30

使用javascript時,出現xmlhttprequest錯誤。我有一個XML文件,我想解析並將其內容分配給網頁。我已經完成了對這部分的研究,而且我似乎無法弄清楚。XMLHttpRequest(Ajax)錯誤

<script = "text/javascript"> 
    window.onload = onPageLoad(); 
    var questionNum = 0; 
    function onPageLoad(questionNum){ 

     var xmlhttp = new XMLHttpRequest(); 
     xmlhttp.open("GET","quiz.xml"); 

     try{ 
      xmlhttp.send(null);//here a xmlhttprequestexception number 101 is thrown 
     }catch(err){ 
      document.getElementById("body").innerHTML += "\nXMLHttprequest error: " + err.description; 
     //this prints "XMLHttprequest error: undefined" in the body. 
     } 

     xmlDoc=xmlhttp.responseXML; 
     parser=new DOMParser(); //this code is untested as it does not run this far. 
    } 
</script> 

我的XML文件很簡單,並且位於相同的目錄中。

<question> 
    <query>what is 2+2?</query> 
    <option>4</option> 
    <option>5</option> 
    <option>3</option> 
    <answer>4</answer> 
</question> 

我找不出我的問題是什麼。對於我通常用C#或Java編程的參考,我正在使用谷歌瀏覽器。

回答

57

所以這裏可能有些問題。

首先閱讀如何使用XMLHttpRequest.open(),因爲有第三個可選參數用於指定是否發出異步請求,默認爲。這意味着您在執行異步請求並需要指定回調函數,然後再執行send()。下面是一個example from the Mozilla Developer Network

var oXHR = new XMLHttpRequest(); 

oXHR.open("GET", "http://www.mozilla.org/", true); 

oXHR.onreadystatechange = function (oEvent) { 
    if (oXHR.readyState === 4) { 
     if (oXHR.status === 200) { 
      console.log(oXHR.responseText) 
     } else { 
      console.log("Error", oXHR.statusText); 
     } 
    } 
}; 

oXHR.send(null); 

其次,因爲你得到一個101錯誤,則可能有錯誤的URL。所以請確保您提出請求的網址是正確的。另外請確保您的服務器能夠爲您的quiz.xml文件提供服務。

您可能需要通過簡化/縮小問題的位置來進行調試。所以我首先做一個簡單的同步請求,這樣你就不用擔心「回調函數」的問題了。因此,這裏是從MDN用於製作同步請求的另一個實例:

var request = new XMLHttpRequest(); 
request.open('GET', 'file:///home/user/file.json', false); 
request.send(null); 

if (request.status == 0) 
    console.log(request.responseText); 

另外,如果你是剛剛起步的JavaScript,你可以參考MDN爲Javascript API文檔/例子/教程。

+0

我仍然有這個問題。當我嘗試Nadir的第二塊代碼時,出現以下錯誤。我懷疑這是我的問題「XMLHttpRequest無法加載file:///Users/me/My%20Directory%20quiz/quiz.xml。只有HTTP支持跨源請求。」 – Muricula 2012-01-15 05:42:09

+0

您輸入的網址應該和以前一樣...該示例中的網址只是一個示例url ... – 2012-01-15 07:18:43

+0

您使用的是什麼Web服務器? – 2012-01-15 07:19:24

2

我看到2個可能出現的問題:

問題1

  • 了XMLHttpRequest對象還沒有完成的時候加載數據,你要使用它

解決方案: 分配對象「onreadystatechange」的回調函數 - 事件並處理該函數中的數據

xmlhttp.onreadystatechange = callbackFunctionName; 

一旦state已達到DONE(4),就可以讀取響應內容。

問題2

  • 了XMLHttpRequest對象不會在所有瀏覽器存在(該名稱)

解決方案: 要麼使用一個try-catch爲正確的瀏覽器創建正確的對象( ActiveXObject在IE中)或者使用框架,例如jQuery ajax-method

注意:如果您決定使用jQuery ajax-method,請將回調函數分配給jqXHR.done()

1

的問題可能在於與線

window.onload = onPageLoad(); 

BBY包括你說的onload應該等於onpPageLoad的回報()括號。例如:

/*Example function*/ 
function onPageLoad() 
{ 
    return "science"; 
} 
/*Set on load*/ 
window.onload = onPageLoad() 

如果打印出來的window.onload的值到控制檯這將是科學。

的解決方案是將線更改爲

window.onload = onPageLoad; 

最後

爲了得到代替

響應值,您需要爲您的XMLHTTP對象readystatechange功能,例如
xmlDoc=xmlhttp.responseXML; 
parser=new DOMParser(); //this code is untested as it does not run this far. 

您可以使用

xmlHttp.onreadystatechange = function() 
{ 
    if(this.readyState == 4){ 
     //Do your thing 
    } 
} 
+0

你說的大部分都是真的,但是把函數的返回值賦給'window.onload'意味着函數必須被執行,因此應該工作。還要注意,聲明函數的地方並沒有什麼區別,因爲JavaScript中的函數聲明被提升到聲明範圍的頂部。 – 2012-01-15 01:19:12

+0

我完全同意你的聲明聲明並編輯了我的答案;看起來我被錯誤的括號所矇蔽了。 – CBusBus 2012-01-15 01:39:50