2012-01-15 101 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