Firefox中通过AJAX 得不到返回值

一、解决在firefox中无法跨域访问的问题
AJAX从本质上讲就是命名用XMLHttpRequest组件来向服务端发送HTTP请求,请接收相应信息。至于成功接收到响应信息后的操作,就和普通的Web客户端程序类似了(一般用DOM将信息加到HTML组件中)。但问题就发生在了XMLHttpRequest组件上。虽然在大多数浏览器中(包括IE、Firefox等)都叫这个名子。使用方法也类似。但在进行某些操作时却有不同的效果。
就拿跨域访问的问题来说。让我们先看看如下的html中的javascript代码:
test.html

  1. <html>
  2.     <head>
  3.         <title></title>
  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <script type="text/javascript">

  6. // 获得IE和firefox浏览器中的XMLHttpRequest对象
  7. function getXMLHTTPRequest()
  8. {
  9.     var myRequest = null;
  10.     if(window.XMLHttpRequest)   // firefox
  11.     {        
  12.         myRequest = new XMLHttpRequest();
  13.     }
  14.     else if(typeof ActiveXObject != "#ff0000")  // IE
  15.     {              
  16.         myRequest = new ActiveXObject("Microsoft.XMLHTTP");
  17.     }         
  18.     return myRequest;         
  19. }

  20. var myRequest;
  21. function onReadyState()   // XMLHttpRequest处理异步访问状态时的事件
  22. {
  23.     if(myRequest.readyState == 4)   // 4表示成功获得相应信息
  24.     {              
  25.         var msg = document.getElementById("msg");
  26.         msg.value = myRequest.responseText            
  27.     }
  28. }
  29. function getServiceText()
  30. {     
  31.     myRequest = getXMLHTTPRequest();
  32.     if(myRequest)
  33.     {         
  34.         myRequest.onreadystatechange = onReadyState;      
  35.         try
  36.         {
  37.             myRequest.open( "post", "http://www.blogjava.net", true);
  38.         }
  39.         catch(exception)
  40.         {
  41.             var msg = document.getElementById("msg");
  42.             msg.value = exception;  
  43.          }
  44.          myRequest.send("test");
  45.     }         
  46. }

  47. </script>
  48.     </head>
  49.     <body>
  50.         <input id="msg" type="text" />
  51.         <input type="button" value="信息" οnclick="getServiceText()" />
  52.     </body>
  53. </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的方法,而要使用编程的方法,在访问其它域之前,可以使用如下代码打开权限:

  1. try
  2. {
  3.     netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
  4. }
  5. catch (exception)
  6. {
  7.     alert(exception);
  8. }
复制代码

 

要注意的是,上面的代码只能用在firefox中,因此,要将其放到只有firefox才能执行到的代码块中,如在下面的块中:

  1. if(window.XMLHttpRequest)   // firefox
  2. {        
  3.     try
  4.     {
  5.         netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
  6.     }
  7.     catch (exception)
  8.     {
  9.         alert(exception);
  10.     }
  11. }
复制代码

 

不能将上面的代码放到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资源的第一行。


转自:http://www.jobedu.com.cn/bbs/thread-4886-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值