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() ,无参数。 在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); 参数说明:
返回值类型: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定义的安全区域内允许发送和接受跨域数据

| 发送请求 \ 被请求的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">
<input type="button" onclick="stopdata()" value="Stop">
<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+跨域请求对象
