最近在学习AJAX,本地调试的时候发现会报“Cross origin requests are only supported for HTTP” 错误。查了一些资料后发现,是因为在直接请求资源的时候(没用服务器的情况下),有的浏览器(如firefox)支持请求本地资源,而有些(如chrome)不支持。
还有就是在实现 httpRequest.onreadystatechange 的时候,通常的代码如下:
try {
if (httpRequest.readyState === 4) {
//如果是本地请求,就不要判断status的值了,试了一下,会返回0.
if (httpRequest.status === 200) {
alert(httpRequest.responseText);
} else {
alert('There was a problem with the request.');
}
}
}
catch( e ) {
alert('Caught Exception: ' + e.description);
}
请求本地资源的时候,就不要判断status的值了,没用服务器自然就不会返回状态值。
以下是转载的部分
-------------------------- 转载分割线 ------------------------------
网站未发布,本地file协议测试【就是直接双击打开或者拖拽进入浏览器中】时,有以下几种情况
假设目录结构如下
root
ajax
ajax.html --ajax请求文件
1.html
files
1.html
folder
1.html
1.html
1)webkit核心的浏览器,如chrome,只能访问自己(或者可以访问其他域名的页面,此页面设置过Access-Control-Allow-Origin=*响应头允许跨域请求),无法访问其他本地资源。ajax.html可以请求ajax.html自己,不能请求同文件夹下的1.html
JavaScript
代码
xhr.open( 'get', 'ajax.html', false); //chrome ajax请求自己没问题
//xhr.open('get', '1.html', false); //请求其他文件报错“Cross origin requests are only supported for HTTP. ”
xhr.send( null)
alert(xhr.responseText)
2)Gecko核心浏览器,如firefox,可以访问ajax文件夹下的所有文件和子文件,但是不能访问上一级目录的文件,报“Access to restricted URI denied”错误
JavaScript
代码
//xhr.open('get', '1.html', false); //没问题
//xhr.open('get', 'files/1.html', false); //没问题
//xhr.open('get', 'files/folder/1.html', false); //没问题
xhr.open( 'get', '../1.html', false); //请求上级目录文件会出错,报“Access to restricted URI denied”错误
xhr.send( null)
alert(xhr.responseText)
3)trident核心的浏览器,如IE,TT之类的,使用XMLHttpRequest【IE7+支持XMLHttpRequest】创建的ajax对象无法请求本地资源所有资源,连请求自身也会报错,会出现拒绝访问错误。
JavaScript
代码
xhr.open( 'get', 'ajax.html', false);
xhr.send( null)
alert(xhr.responseText)
使用acx创建的ajax对象则没有任何限制,哪怕是访问其他盘的文件或者其他站点的内容。
JavaScript
代码
var xhr = new ActiveXObject( "microsoft.xmlhttp");
//xhr.open('get', '1.html', false); //没问题
//xhr.open('get', 'files/1.html', false); //没问题
//xhr.open('get', 'files/folder/1.html', false); //没问题
//xhr.open('get', '../1.html', false); //访问上级目录也没问题
//xhr.open('get', 'c:\\InstallPackage.log', false); //直接指定物理路径访问其他盘的文件也没问题
xhr.open( 'get', 'http://www.coding123.net/json.asp', false); //访问其他站点的内容
xhr.send( null);
alert(xhr.responseText)