一、解决在firefox
中无法跨域访问的问题
AJAX
从本质上讲就是命名用XMLHttpRequest
组件来向服务端发送HTTP
请求,请接收相应信息。至于成功接收到响应信息后的操作,就和普通的Web
客户端程序类似了(一般用DOM
将信息加到HTML
组件中)。但问题就发生在了XMLHttpRequest
组件上。虽然在大多数浏览器中(包括IE
、Firefox
等)都叫这个名子。使用方法也类似。但在进行某些操作时却有不同的效果。
就拿跨域访问的问题来说。让我们先看看如下的html
中的javascript
代码:
test.html
<
html
>
< head >
< title ></ title >
< meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
< script type ="text/javascript" >
// 获得IE和firefox浏览器中的XMLHttpRequest对象
function getXMLHTTPRequest()
{
var myRequest = null ;
if (window.XMLHttpRequest) // firefox
{
myRequest = new XMLHttpRequest();
}
else if ( typeof ActiveXObject != " #ff0000 " ) // IE
{
myRequest = new ActiveXObject( " Microsoft.XMLHTTP " );
}
return myRequest;
}
var myRequest;
function onReadyState() // XMLHttpRequest处理异步访问状态时的事件
{
if (myRequest.readyState == 4 ) // 4表示成功获得相应信息
{
var msg = document.getElementById( " msg " );
msg.value = myRequest.responseText
}
}
function getServiceText()
{
myRequest = getXMLHTTPRequest();
if (myRequest)
{
myRequest.onreadystatechange = onReadyState;
try
{
myRequest.open( " post " , " http://www.blogjava.net " , true );
}
catch (exception)
{
var msg = document.getElementById( " msg " );
msg.value = exception;
}
myRequest.send( " test " );
}
}
</ script >
</ head >
< body >
< input id ="msg" type ="text" />
< input type ="button" value ="信息" onclick ="getServiceText()" />
</ body >
</ html >
< head >
< title ></ title >
< meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
< script type ="text/javascript" >
// 获得IE和firefox浏览器中的XMLHttpRequest对象
function getXMLHTTPRequest()
{
var myRequest = null ;
if (window.XMLHttpRequest) // firefox
{
myRequest = new XMLHttpRequest();
}
else if ( typeof ActiveXObject != " #ff0000 " ) // IE
{
myRequest = new ActiveXObject( " Microsoft.XMLHTTP " );
}
return myRequest;
}
var myRequest;
function onReadyState() // XMLHttpRequest处理异步访问状态时的事件
{
if (myRequest.readyState == 4 ) // 4表示成功获得相应信息
{
var msg = document.getElementById( " msg " );
msg.value = myRequest.responseText
}
}
function getServiceText()
{
myRequest = getXMLHTTPRequest();
if (myRequest)
{
myRequest.onreadystatechange = onReadyState;
try
{
myRequest.open( " post " , " http://www.blogjava.net " , true );
}
catch (exception)
{
var msg = document.getElementById( " msg " );
msg.value = exception;
}
myRequest.send( " test " );
}
}
</ script >
</ head >
< body >
< input id ="msg" type ="text" />
< input type ="button" value ="信息" onclick ="getServiceText()" />
</ body >
</ html >
如果在IE
中访问上面的html
文件,url
如下:
http://localhost:8080/test.html
会弹出一个对话框,大概意思是说您已经跨域访问了,可能存在风险,是否继续。如果继续执行的话,仍然可以访问http://www.blogjava.net
。但是在firefox
中却更本无法访问其它域的url
,并且会抛出“调用方法
XMLHttpRequest.open
时权限不足”异常。解决的方法一般有两种,一种是修改firefox
的设置,在firefox
的地址栏中输入“about:config
”,并找到signed.applets.codebase_principal_support
,将其设为true
。如图1
所示。
图1
但这种方法经过实现,仍然无法访问其他域的
url
,不知是不是新版的
firefox
把这个给屏蔽了。就算这种方法可行,也尽量不使用这种需要配置
firefox
的方法,而要使用编程的方法,在访问其它域之前,可以使用如下代码打开权限:
try
{
netscape.security.PrivilegeManager.enablePrivilege( " UniversalBrowserRead " );
}
catch (exception)
{
alert(exception);
}
{
netscape.security.PrivilegeManager.enablePrivilege( " UniversalBrowserRead " );
}
catch (exception)
{
alert(exception);
}
要注意的是,上面的代码只能用在
firefox
中,因此,要将其放到只有
firefox
才能执行到的代码块中,如在下面的块中:
if
(window.XMLHttpRequest)
//
firefox
{
try
{
netscape.security.PrivilegeManager.enablePrivilege( " UniversalBrowserRead " );
}
catch (exception)
{
alert(exception);
}
}
{
try
{
netscape.security.PrivilegeManager.enablePrivilege( " UniversalBrowserRead " );
}
catch (exception)
{
alert(exception);
}
}
不能将上面的代码放到getXMLHTTPRequest
中,应放到getServiceText
中。
注:如果test.html
在通过web
服务器访问,而是按着访问本地文件时访问test.html
时,在IE
中不会出现上述的提示对话框,而是直接就可以访问其他的域。
二、其他的跨浏览器问题
不同浏览器的XMLHttpRequest
虽然接口一样,但在不同浏览器中调用XMLHttpRequest
的方法和属性的效果不同。如send
方法,在IE
中可以不传参数,如myRequest.send();
仍然可以正常工作,而在firefox
中,必须为send
方法传一个参数,也就是说,在firefox
中send
方法参数没有默认值,必须为其赋值。为了通用起见,建议所有的send
方法都为其赋一个参数值,哪怕是空串。
除了send
方法,responseText
属性也是一样,在IE
中,responseText
返回了整个web
资源的内容,而在firefox
中只返回web
资源的第一行。
本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215351,如需转载请自行联系原作者