Ajax 与 Comet
就叫 Ajax,即 Asynchronous JavaScript + XML ,异步JS+XML。 Ajax 技术的核心是 XMLHttpRequest 对象(简称 XHR),XHR 为向服务器发送请求和解析服务器响应提供了流畅的接口。能够以异步方式从服务器取得信息,意味着用户单击后,可以不必刷新页面也能取得新数据。 也就是说,可以使用 XHR 对象取得新数据,然后再通过 DOM 将新数据插入到页面中。 另外,虽然名字中包含 XML 的成分,但 Ajax 通信与数据格式无关;这种技术就是无须刷新页面即可从服务器取得数据,但不一定是 XML 数据。 XMLHttpRequest对象IE7+、Firefox、Opera、Chrome 和 Safari 都支持原生的 XHR 对象,在这些浏览器中创建 XHR 对象要像下面这样使用 XMLHttpRequest 构造函数。 var xhr = new XMLHttpRequest();
XHR的用法在使用 XHR 对象时,要调用的第一个方法是 open(),它接受 3 个参数: xhr.open("get","example.php",false);
这行代码会启动一个针对 example.php 的 GET 请求。 并且, 只能向同一个域中使用相同端口和协议的 URL 发送请求。如果 URL 与启动请求的页面的域有任何差别,都会引发安全错误。也就是说,跨域问题是Ajax的短板。 要发送特定的请求,必须像下面这样调用 send()方法 xhr.open("get","example.txt",false);
xhr.send(null);
这里的 send() 方法接收一个参数,即要作为请求主体发送的数据。如果不需要通过请求主体发送数据,则必须传入 null,因为这个参数对有些浏览器来说是必需的。 在收到服务器的响应后,响应的数据会自动填充 XHR 对象的属性,相关的属性简介如下: 在接收到响应后,第一步是检查 status 属性,以确定响应已经成功返回。 为确保接收到适当的响应,应该像下面这样检查上述这两种状态代码: if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
alert(xhr.responseText);
} else {
alert("Request was unsuccessful: " + xhr.status);
}
注意:无论内容类型是什么,响应主体的内容都会保存到 responseText 属性中;而对于非 XML 数据而言,responseXML 属性的值将为 null。 多数情况下,我们要发送的是异步请求,这样才能让 JavaScript 继续执行而不必等待响应。此时,可以检测 XHR 对象的 readyState 属性,该属性表示请求/响应过程的当前活动阶段。 只要 readyState 属性的值由一个值变成另一个值,都会触发一次 readystatechange 事件。可以利用这个事件来检测每次状态变化后 readyState 的值。通常,我们只对 readyState 值为 4 的阶段感兴趣,因为这时所有数据都已经就绪。 最好在调用 open()之前指定 onreadystatechange 事件处理程序,这样可以确保跨浏览器兼容性。 另外,在接收到响应之前还可以调用 abort()方法来取消异步请求,如下所示: xhr.abort();
调用这个方法后,XHR 对象会停止触发事件,而且也不再允许访问任何与响应有关的对象属性。在 终止请求之后,还应该对 XHR 对象进行解引用操作。 HTTP头部信息默认情况下,在发送 XHR 请求的同时,还会发送下列头部信息。 Accept:浏览器能够处理的内容类型。 虽然不同浏览器实际发送的头部信息会有所不同,但以上列出的基本上是所有浏览器都会发送的。 xhr.open("get",true);
xhr.setRequestHeader("MyHeader","MyValue");
xhr.send(null);
我们建议读者使用自定义 的头部字段名称,不要使用浏览器正常发送的字段名称,否则有可能会影响服务器的响应。 此外,有的浏览器允许开发人员重写默认的头部信息,但有的浏览器则不允许这样做。 调用 XHR 对象的 getResponseHeader()方法并传入头部字段名称,可以取得相应的响应头部信息。而调用 getAllResponseHeaders()方法则可以取得一个包含所有头部信息的长字符串。 GET请求GET 是最常见的请求类型,最常用于向服务器查询某些信息。 //编码函数
function addURLParam(url,name,value) {
url += (url.indexOf("?") == -1 ? "?" : "&");
url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
return url;
}
POST请求使用频率仅次于 GET 的是 POST 请求,通常用于向服务器发送应该被保存的数据。 发送 POST 请求的第二步就是向 send() 方法中传入某些数据。由于 XHR 最初的设计主要是为了处理 XML,因此可以在此传入 XML DOM 文档,传入的文档经序列化之后将作为请求主体被提交到服务器。 //使用 XHR 来模仿表单提交
xhr.open("post","postexample.php",true);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
var form = document.getElementById("user-info");
xhr.send(serialize(form));
XMLHttpRequest 2 级XMLHttpRequest 2 级则进一步发展了 XHR。并非所有浏览器都完整地实现了 XMLHttpRequest 2 级规范,但所有浏览器都实现了它规定的部分内容。 FormDataFormData 为序列化表单以及创建与表单格式相同的数据(用于通过 XHR 传输)提供了便利。 var data = new FormData();
data.append("name","Nicholas");
而通过向 FormData 构造函数中传入表单元素,可以利用表单元素的数据向其中填入键值对儿: var data = new FormData(document.forms[0]);
创建了 FormData 的实例后,就可以将它直接传给 XHR 的 send() 方法。 var form = document.getElementById("user-info");
xhr.send(new FormData(form));
使用 FormData 的方便之处体现在,不必像使用serialize方法时那样在 XHR 对象上设置请求头部。XHR 对象能够识别传 入的数据类型是 FormData 的实例,并配置适当的头部信息。 进度事件这些进度事件都是和客户端与服务器通信状态有关的事件,最早其实只针对 XHR 操作,但目前也被其他 API 借鉴。这些事件共有6个,如下所列:
每个请求都从触发 loadstart 事件开始,接下来是一或多个 progress 事件,然后触发 error、abort 或 load 事件中的一个,最后以触发 loadend 事件结束。 支持前 5 个事件的浏览器有 Firefox 3.5+、Safari 4+、Chrome、iOS 版 Safari 和 Android 版 WebKit。 跨源资源共享默认情况下,XHR 对象只能访问与包含它的页面位于同一个域中的资源。这种安全策略可以预防某些恶意行为。但是,实现合理的跨域请求对开发某些浏览器应用程序也是至关重要的。 (待续) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |