XMLHttpRequest 状态 0(responseText 为空)

2022-08-30 05:22:45

无法使用 XMLHttpRequest 获取数据(状态 0 且 responseText 为空):

xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","http://www.w3schools.com/XML/cd_catalog.xml", true);
xmlhttp.onreadystatechange=function() 
{
  if(xmlhttp.readyState==4)
    alert("status " + xmlhttp.status);
}
xmlhttp.send();

它会发出警报“状态 0”。

本地主机请求的情况相同(cd_catalog.xml另存为本地文件)

xmlhttp.open("GET","http://localhost/cd_catalog.xml", true);

但是对于本地主机 IP 请求

xmlhttp.open("GET","http://127.0.0.1/cd_catalog.xml", true);

和本地文件请求

xmlhttp.open("GET","cd_catalog.xml", true);

一切正常(状态 200)

什么可能导致联机请求出现问题(状态 = 0)?

PS:实时HTTP标头显示,在所有4种情况下一切正常:

  HTTP/1.1 200 OK
  Content-Length: 4742

PS2:VMWare上的Apache本地Web服务器(主机OS Win7,Guest OS Ubuntu,网络适配器 - NAT)。浏览器 – 火狐.


答案 1

当包含脚本的 html 文件通过文件方案在浏览器中打开时,status 为 0。确保将文件放在服务器中(apache或tomcat等),然后通过浏览器中的http协议打开它。(即 http://localhost/myfile.html)这就是解决方案。


答案 2

问题的原因是您尝试执行跨域调用,但失败

如果你正在做本地主机开发,你可以进行跨域调用 - 我一直在这样做。

对于火狐浏览器,您必须在配置设置中启用它

signed.applets.codebase_principal_support = true

然后,将类似如下内容添加到 XHR 打开代码中:

  if (isLocalHost()){
    if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
      netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
    }
  }

对于IE,如果我没记错的话,您所要做的就是在“杂项→跨域访问数据源”下启用浏览器的安全设置,以使其与ActiveX XHR一起使用。

IE8及更高版本还为本机XmlHttpRequest对象添加了跨域功能,但我还没有使用这些功能。