Ajax 前端技术
前端技术: 在浏览器中执行的程序都是前端, html, css, js等等. 后端技术: 在服务器中执行的程序, 使用 java 语言开发的后端程序, servlet.jsp, jdbc.mysql, tomcat 等等.
1. 全局刷新和局部刷新
-
全局刷新: 使用 form, href 等发起的请求是全局刷新. 用户发起请求, 视图改变了, 跳转视角, 使用新的数据局添加到页面. 缺点:
- 传递数据量比较大, 占用网络的带宽;
- 浏览器需要重新的渲染整个页面;
- 用户的体验不是那么好.
-
局部刷新: 在当前页面中, 发起请求, 获取数据, 更新当前页面的 dom 对象, 对视图部分刷新. 特点:
- 数量比较小, 在网络中传输速度快;
- 更新一个页面内容, 是部分更新页面, 浏览器不用全部渲染视图;
- 在一个页面中, 可以做多个局部刷新;
- 从服务器获取的输数据, 拿到更新视图.
2. 异步请求对象
在局部刷新中, 使用异步请求对象, 在浏览器内部发起请求, 获取数据. 异步对象是在浏览器内部的一种 javascript 对象. 各大浏览器都能支持异步对象的使用. (Chrome, Firefox, Opera…) 异步对象 XMLHttpRequest
3. 异步对象 XMLHttpRequest 介绍
js 中的一种对象, 使用 js 语法创建和使用这个对象.
var xhr = new XMLHttpRequest();
之后就可以使用 xhr 对象是的属性或者函数, 进行异步对象的操作.
使用异步对象实现局部刷新, 异步对象主要负责发起请求, 传递请求的参数, 并从服务器接收数据.
局部刷新需要使用的那些技术: 1). javascript: 创建 XMLHttpRequest 对象, 调用它的属性或者方法; 2). dom: 处理 DOM, 更新 select 的数据; 3). css: 处理视图, 更新, 美化; 4). servlet: 服务端技术; 5). 数据格式: json. (它之前是 XML) 把上面这些技术的综合使用叫做 ajax(阿贾克斯).
4. Ajax
AJAX = Asynchronous JavaScript and XML (异步的 JavaScript 和 XML). AJAX 是一种在无需重新加载整个网页的情况下, 能够更新部分网页内容的新方法.
AJAX 不是新的编程语言, 它是多种几乎的综合使用, 包含了 javascript, dom, css, 服务端技术, servlet, jsp, jdbc 等等, 还有 json 数据格式.
使用 AJAX 实现局部刷新.
Ajax 核心是 javascript 和 xml (json): 使用 javascript 操作异步对象 XMLHttpRequest, 和服务器交互使用 json 数据格式.
5. 异步对象 XMLHttpRequest 属性和方法
-
创建异步对象, 使用 js 的语法 var xhr = new XMLHttpRequest();
-
XMLHttpRequest 方法 ① open(请求方式, 服务器端的访问地址, 异步还是同步); 例如: xhr.open("get", "loginServlet", true);
② send(); 使用异步对象发送请求 -
XMLHttpRequest 属性 readyState 属性: ? 0: 表示创建异步对象时, new XMLRequest(); ? 1: 表示初始异步对象的请求参数, 执行 open() 方法; ? 2: 使用 send() 方法发送请求; ? 3: 使用异步对象从服务器接收了数据; ? 4: 异步对象接收了数据, 并在异步对象内部处理完成后. status 属性: 网络的状态, 和 Http 的状态码对应 ? 200: 请求成功; ? 404: 服务器资源没有找到; ? 500: 服务器内部代码有错误. responseText 属性: 表示服务器端返回的数据 例如: var data = xhr.responseText;
6. 异步对象 XMLHttpRequest 使用步骤
- 使用 js 创建异步对象
var xhr = new XMLHttpRequest();
- 给异步对象绑定事件吗事件名称: onreadystatechange
例如: button 增加单击事件 onclick
<input type="button" onclick="btnClick()" />
<script type="text/javascript">
function btnClick() {
}
xhr.onreadystatechange = function() {
}
</script>
? 在绑定事件中做什么, 根据 readyState 值做请求的处理
xhr.readystatechange = function () {
if(xhr.readyState == 4) {
var data = xhr.responseText;
document.getElementById("#mydiv").innerHtml = data;
}
}
- 初始请求的参数, 执行 open() 函数
xhr.open("get", "loginServlet", true);
- 发送请求, 执行 send()
xhr.send();
7. 同步请求和异步请求
看 open(请求方式, 访问 url 地址, boolean 是不是异步的) true: 异步请求; false: 同步请求.
8. 扩展
使用方法
? 使用 ajax 的过程可以类比平常我们访问网页的过程
var xhr = new XMLHttpRequset();
xhr.open('GET', './time.php');
xhr.send(null);
xhr.onreadystatechange = function () {
if (this.readyState === 4) {
console.log(this);
}
}
FormData
以前 AJAX 只能提交字符串, 现在可以提交二进制的数据.
处理响应数据渲染
? 模板引擎: artTemplate ? 模板引擎实际上就是一个 API,模板引擎有很多种,使用方式大同小异,目的为了可以更容易的将数据渲染到 HTML 中。
兼容方案
? XMLHttpRequest 在老版本浏览器(IE5/6)中有兼容问题, 可以通过另外一种方式代替.
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
9. 封装
? AJAX 请求封装
function ajax (method, url, params, done) {
method = method.toUpperCase();
var pairs = [];
for (var key in params) {
pairs.push(key + '=' + params[key]);
}
var querystring = pairs.join('&');
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
xhr.addEventListener('readystatechange', function () {
if (this.readyState !== 4) return;
try {
done(JSON.parse(this.responseText));
} catch (e) {
done(this.responseText) ;
}});
if (method === 'GET') {
url += '?' + querystring;
}
xhr.open(method, url);
var data = null if (method === 'POST') {
xhr.setRequestHeader('Content‐Type','application/x‐www‐form‐urlencoded');
data = querystring;
}
xhr.send(data);
}
ajax('get', './get.php', { id: 123 }, function (data) {
console.log(data);
});
ajax('post', './post.php', {
foo: 'posted data';
}, function (data) {
console.log(data);
});
10. 跨域
相关概念: 同源策略是浏览器的一种安全策略, 所谓同源是指域名, 协议, 端口完全相同, 只有同源的地址才可以相互通过 AJAX 的方式请求.
同源或者不同源说的是两个地址之间的关系, 不同源地址之间请求我们称之为跨域请求.
解决方案:
JSON with Padding, 是一种借助于 script 标签发送跨域请求的技巧. 其原理就是在客户端借助 script 标签请求服务端的一个动态网页, 服务端的这个动态网页返回一段带有函数调用的 JavaScript 全局函数调用的脚本, 将原本需要返回给客户端的数据传递出去. 以后绝大多数情况都是采用 JSONP 的手段完成不同源地址之间的跨域请求.
注意: JSONP 用的是 script 标签, 与 AJAX 提供的 XMLHttpRequest 没有任何关系!!!
CORS: Cross Origin Resource Share, 跨域资源共享
header('Access-Control-Allow-Origin: *');
这种方案无需客户端做出任何变化(客户端不用改代码), 只是在被请求的服务端相应的时候添加一个 Access-Control-Allow-Origin 的响应头, 表示这个资源是否允许指定域请求.
|