XDomainRequest,IE8+跨域请求对象

  XDomainRequest,ie8+浏览器跨域请求的ajax对象。

XDomainRequest成员

  XDomainRequest对象有如下成员

事件

  XDomainRequest对象有如下事件

事件名称 描述
onerror

在跨域请求发生错误时触发,事件方法没有参数。示例如下

function err()
{
    alert("XDR onerror");
}
//...
xdr.onerror = err; 
onload

跨域请求完毕后触发,事件方法没有参数。示例如下

function loadd()
{
    alert("XDR onload");
    alert("Got: " + xdr.responseText);
}
//...
xdr.onload = loadd; 
onprogress

跨域请求接受数据时触发,事件方法没有参数,此事件在调用send方法和onload事件触发间隔内触发0,1或者无数次。示例如下

function progres()
{
    alert("XDR onprogress");
    alert("Got: " + xdr.responseText);
}
//...
xdr.onprogress = progres;
ontimeout

跨域请求连接超时时触发,事件方法没有参数。此事件限于onload事件触发。触发了ontimeout事件,XDomainRequest属性responseText不可用,调用此属性会报错。示例如下

function timeo()
{
    alert("XDR ontimeout");
}
//...
xdr.ontimeout = timeo; 

 

方法

  XDomainRequest对象有如下方法

方法名称 描述
abort

终止当前http跨域请求。使用方法:object.abort() ,无参数。
返回值类型:HRESULT,成功执行返回S_OK,否则返回HRESULT错误代码。

在open方法被调用后,onload事件触发前调用,在其他时间段内调用此方法会报错。示例如下

// 1. Create XDR object 
xdr = new XDomainRequest(); 
// 2. Open connection with server using POST method
xdr.open("POST", "http://www.contoso.com/xdr.txt");
// 3. Send string data to server
xdr.send("data to be processed");   
// 4. abort
xdr.abort(); 
open (XDomainRequest)

链接服务器,打开跨域请求,语法

HRESULT retVal = object.open(bstrMethod, bstrUrl);

参数说明:

  • bstrMethod:字符串,请求方法,get或者post
  • bstrUrl:字符串,服务器url地址

返回值类型:HRESULT,成功执行返回S_OK,否则返回HRESULT错误代码。

send (XDomainRequest)

发送到服务器的字符串数据,语法

HRESULT retVal = object.send(varBody);

示例

// 1. Create XDR object 
xdr = new XDomainRequest(); 
// 2. Open connection with server using POST method
xdr.open("POST", "http://www.contoso.com/xdr.txt");
// 3. Send string data to server
xdr.send("data to be processed");   

 

属性

  XDomainRequest对象有如下属性

属性名称 描述

constructor

返回对象构造函数

contentType

获取请求或者想要的内容类型。语法

HRESULT value = object.get_contentType( p);

responseText

响应的内容,字符串格式

timeout

获取或者设置跨域请求超时时间,单位毫秒

备注

  XDomainRequest对象为一个允许脚本连接任何服务器并且交互数据的安全,可信,轻量级数据服务。开发使用 XDomainRequest 对象发送有跨域安全当前ajax请求。

  安全警告:  跨域请求(XDRs)匿名保护用户数据,就是说服务器不能确定谁在请求数据。为了保护用户隐私,跨域返回的数据不能为敏感或者个人身份识别之类的信息。为了防止泄露数据给恶意的站点,不鼓励启用XDRs请求。

  跨域请求要页面和服务器之间双方同意才行。使用 XDomainRequest (XDR) 创建对象,链接到服务器,文档请求服务器时添加一个Origin  请求头代表请求源,只有当服务器设置了 Access-Control-Allow-Origin 响应头为* 或者为发送请求的url地址。此行为为万维网联盟 (W3C)定义的网站项目允许客户端跨域通信的框架草案。

  以asp为例,设置响应头代码如下

<% Response.AddHeader("Access-Control-Allow-Origin","*") %>

			

  跨域请求在下面IE定义的安全区域内允许发送和接受跨域数据

XDomainRequest,IE8+跨域请求对象

发送请求 \ 被请求的URL Intranet Trusted(Intranet) Trusted(Internet) Internet Restricted
Intranet Allow Allow Allow Allow Deny
Trusted(Intranet) Allow Allow Allow Allow Deny
Trusted(Internet) Deny Deny Allow Allow Deny
Internet Deny Deny Allow Allow Deny
Restricted Deny Deny Deny Deny Deny

 

  跨域请求仅支持http:// 和https:// 2种协议。

  IE下XDomainRequest使用示例如下

// 1. 创建XDR对象 
var xdr = new XDomainRequest(); 
// 2. 打开服务器连接
xdr.open("get", "http://www.contoso.com/xdr.aspx");
// 3. 发送需要的数据
xdr.send();

			

示例

  下面示例发送空的内容到指定的跨域页面。

      
<!DOCTYPE html>
<html>
<body>
  <h2>XDomainRequest</h2>
  <input type="text" id="tbURL" value="http://www.contoso.com/xdr.txt" style="width: 300px"><br>
  <input type="text" id="tbTO" value="10000"><br>
  <input type="button" onclick="mytest()" value="Get">&nbsp;&nbsp;&nbsp;
    <input type="button" onclick="stopdata()" value="Stop">&nbsp;&nbsp;&nbsp;
    <input type="button" onclick="readdata()" value="Read">
  <br>
  <div id="dResponse"></div>
  <script>
    var xdr;
    function readdata()
    {
      var dRes = document.getElementById('dResponse');
      dRes.innerText = xdr.responseText;
      alert("Content-type: " + xdr.contentType);
      alert("Length: " + xdr.responseText.length);
    }
    
    function err()
    {
      alert("XDR onerror");
    }
    function timeo()
    {
      alert("XDR ontimeout");
    }
    function loadd()
    {
      alert("XDR onload");
      alert("Got: " + xdr.responseText);
    }
    function progres()
    {
      alert("XDR onprogress");
      alert("Got: " + xdr.responseText);
    }
    function stopdata()
    {
      xdr.abort();
    }
    function mytest()
    {
      var url = document.getElementById('tbURL');
      var timeout = document.getElementById('tbTO');
      if (window.XDomainRequest)
      {
        xdr = new XDomainRequest();
        if (xdr)
        {
          xdr.onerror = err;
          xdr.ontimeout = timeo;
          xdr.onprogress = progres;
          xdr.onload = loadd;
          xdr.timeout = tbTO.value;
          xdr.open("get", tbURL.value);
          xdr.send();
        }
        else
        {
          alert("Failed to create");
        }
      }
      else
      {
        alert("XDR doesn't exist");
      }
    }
  </script>
</body>
</html>

				

e文来源:http://msdn.microsoft.com/en-us/library/cc288060%28VS.85%29.aspx


原创文章,转载请注明出处:XDomainRequest,IE8+跨域请求对象

评论(0)Web开发网
阅读(5728)喜欢(0)不喜欢(0)JavaScript/Ajax开发技巧