JS高程3:Ajax与Comet-进度事件、跨源资源共享

有以下 6 个进度事件

? loadstart:在接收到响应数据的第一个字节时触发。
? progress:在接收响应期间持续不断地触发。
? error:在请求发生错误时触发。
? abort:在因为调用 abort()方法而终止连接时触发。
? load:在接收到完整的响应数据时触发。
? loadend:在通信完成或者触发 error、 abort 或 load 事件后触发。

每个请求都从触发 loadstart 事件开始,接下来是一或多个 progress 事件,然后触发 error、abort 或 load 事件中的一个,最后以触发 loadend 事件结束。

目前浏览器只支持前五个进度事件。

load事件

var xhr = createXHR();
xhr.onload = function(){
	if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
		alert(xhr.responseText);
	} else {
		alert("Request was unsuccessful: " + xhr.status);
	}
};
xhr.open("get", "altevents.php", true);
xhr.send(null);

 progress事件

这个事件会在浏览器接收新数据期间周期性地触发。

onprogress 事件处理程序会接收到一个 event 对象,其 target 属性是 XHR 对象,但包含着三个额外的属性:

lengthComputable、 position 和 totalSize。

其中, lengthComputable是一个表示进度信息是否可用的布尔值, position 表示已经接收的字节数, totalSize 表示根据
Content-Length 响应头部确定的预期字节数。

var xhr = createXHR();
xhr.onload = function(event){
	if ((xhr.status >= 200 && xhr.status < 300) ||
		xhr.status == 304){
		alert(xhr.responseText);
	} else {
		alert("Request was unsuccessful: " + xhr.status);
	}
};
xhr.onprogress = function(event){
	var divStatus = document.getElementById("status");
	if (event.lengthComputable){
		divStatus.innerHTML = "Received " + event.position + " of " +
		event.totalSize +" bytes";
	}
};
xhr.open("get", "altevents.php", true);
xhr.send(null);

如果响应头部中包含Content-Length 字段,那么也可以利用此信息来计算从响应中已经接收到的数据的百分比。

跨源资源共享

CORS(Cross-Origin Resource Sharing,跨源资源共享)
定义了在必须访问跨源资源时,浏览器与服务器应该如何沟通。

CORS 背后的基本思想,就是使用自定义的 HTTP 头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。

IE对CORS的实现

微软在 IE8 中引入了 XDR(XDomainRequest)类型。

? cookie 不会随请求发送,也不会随响应返回。
? 只能设置请求头部信息中的 Content-Type 字段。
? 不能访问响应头部信息。
? 只支持 GET 和 POST 请求。

发送请求报文

var xdr = new XDomainRequest();
xdr.onload = function(){
	alert(xdr.responseText);
};
xdr.open("get", "http://www.somewhere-else.com/page/");
xdr.send(null);

检测错误

var xdr = new XDomainRequest();
xdr.onload = function(){
	alert(xdr.responseText);
};
xdr.onerror = function(){
	alert("An error occurred.");
};
xdr.open("get", "http://www.somewhere-else.com/page/");
xdr.send(null);

其他浏览器CORS的实现

var xhr = createXHR();
xhr.onreadystatechange = function(){
	if (xhr.readyState == 4){
		if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
			alert(xhr.responseText);
		} else {
			alert("Request was unsuccessful: " + xhr.status);
		}
	}
};
xhr.open("get", "http://www.somewhere-else.com/page/", true);
xhr.send(null);

与 IE 中的 XDR 对象不同,通过跨域 XHR 对象可以访问 status 和 statusText 属性,而且还支
持同步请求。跨域 XHR 对象也有一些限制,但为了安全这些限制是必需的。以下就是这些限制

? 不能使用 setRequestHeader()设置自定义头部。
? 不能发送和接收 cookie。
? 调用 getAllResponseHeaders()方法总会返回空字符串。
时间: 2024-08-22 19:13:11

JS高程3:Ajax与Comet-进度事件、跨源资源共享的相关文章

JS学习19(Ajax与Comet)

Ajax:Asynchronous JavaScript + XML的简写. Ajax技术的核心是XMLHttpRequest对象(XHR),XHR为向服务器发送请求和解析服务器响应提供了流畅的接口.能够以异步方式从服务器取得信息,再通过DOM将新数据插入到页面中. XMLHttpRequest对象 IE7+ Firefox Opera Chrome Safari原生支持XHR对象. var xhr = new XMLHttpRequest(); XHR的用法 在使用XHR对象时,要调用的第一个

javascript AJAX与Comet详解

          博客专家福利      [限时活动]建专辑得大奖       专访荣浩:流程的永恒之道      当青春遇上互联网,能否点燃你的创业梦      推荐有礼--找出您心中的技术大牛 javascript AJAX与Comet详解 分类: javascript2012-12-24 17:39 367人阅读 评论(0) 收藏 举报 XMLHttpRequest对象 在IE5中,XHR对象是通过MSXML库中的ActiveX对象实现的.在IE中可能会遇到三种不同版本的XHR对象,即M

Ajax与Comet的介绍与区别

Ajax(Asynchronous JavaScript + XML的简写)可以向服务器请求数据而无需卸载(刷新)页面,带来更好的用户体验. Ajax技术的核心是XMLHttpRequest对象(简称XHR). 一.XMLHttpRequest对象 /* 兼容IE早期版本 */ function createXHR(){ if (typeof XMLHttpRequest != "undefined"){ return new XMLHttpRequest(); } else if (

《JAVASCRIPT高级程序设计》Ajax与Comet

Ajax,是Asynchronous JavaScript + XML的简写,这一技术能向服务器请求额外的技术而无需卸载页面,会带给用户更好的体验.Ajax的核心是XMLHttpRequest对象.为了防止XSS(跨站点脚本).CSRF(跨站点请求伪造)等攻击,Ajax有着同源策略的限制:解决跨域的方式有CORS(跨源资源共享).图像Ping和JSONP. Comet是对Ajax的扩展,让服务器向浏览器推送数据,有长轮询和HTTP流两种方式实现. webSocket是一种使用自定义的协议,与服务

原生js学习笔记——Ajax基础

1.什么是Ajax Ajax:是Asynchronous Javascript And XML的简写,即异步JavaScript和XML XMLHttpRequest 提供的异步,是指基于 ajax 的应用在服务器中的通信方式. 传统的 web 应用,每次用户向服务器请求获得新数据时,浏览器都会丢弃当前页面,而等待重新加载新的页面.这样一来,在服务器完全响应之前,用户浏览器将一片空白,用户的动作必须中断.而异步指用户发送请求后,完全无需等待,请求会在后台发送,不会阻塞用户当前活动.这样一来,用户

[转]AJAX 跨源 HTTP 请求

转自OSChina, 原文: http://www.oschina.net/translate/ajax-cross-origin-http-request 背景 跨源HTTP请求(也称跨域AJAX请求)是大多数Web开发人员可能遇到的一个问题,根据同源策略,浏览器将限制客户端的JavaScript在一个安全沙箱内,通常JS不能直接同一台不同的域的远程服务器通信.在过去,开发者们创造了许多解决方法以实现跨域资源请求,常用的方法如下: 使用Flash/Silverlight或服务器端"代理&quo

跨源Ajax请求

1.Ajax介绍 Ajax是现代交互式网页应用的网页开发技术,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新,AJAX 的核心是 JavaScript 对象 XMLHttpRequest.该对象在 Internet Explorer 5 中首次引入,它是一种支持异步请求的技术.简而言之,XMLHttpRequest使您可以使用 JavaScript 向服务器提出请求并处理响应,而不阻塞用户. 默认情况下浏览器

《JS高程》事件学习笔记

事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. ------------------------------------------------------------------------------------------------------------- 一.事件流 事件流:描述的是页面中接收事件的顺序. IE:事件冒泡流,即事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档): NetScape:事件捕获流,即不太具体的节

JS高程3:事件

事件是JS和HTML交互的方式. 事件流 事件流是HTML文档接收事件的顺序.分为2个流派:事件冒泡流和事件捕捉流. 事件冒泡流 由内到外 事件捕捉流 由外到内 DOM事件流 事件处理程序