21-Ajax
18.12 Ajax
Ajax(它来源于“Asynchronous JavaScript and XML”的首字母缩写)允许客户端与服务端进行异步通信:页面上的元素在不加载整个页面的情况下刷新服务器(server)端的数据。在本世纪初引入 XMLHttpRequest 对象之后,这个创新才得以实现,从而开启了众所周知的“Web 2.0”时代。
Ajax的核心概念很简单:运行在浏览器端的JavaScript以可编程的的方式将HTTP request发送到server,server再返回所请求的数据,这种数据通常以JSON格式传输(在JavaScript中,JSON格式比XML格式更容易使用)。这些数据可以在浏览器上实现更多的功能。Ajax是基于HTTP的(像不使用Ajax的页面一样),这样一来,就降低了渲染和传输页面的开销,从而提高了Web应用的性能,至少从用户角度来看是这样的。
使用Ajax之前,必须得先有一个服务器(server)。这里用Node.js(先预习一下20章的内容)写一个最简单的服务器,它会暴露一个Ajax的endpoint(一个被其他服务或应用使用的特殊service)。创建一个叫作ajaxServer.js的文件:
const http = require('http');
const server = http.createServer(function(req, res) {
res.setHeader('Content-Type', 'application/json');
res.setHeader('Access-Control-Allow-Origin', '*');
res.end(JSON.stringify({
platform: process.platform,
nodeVersion: process.version,
uptime: Math.round(process.uptime()),
}));
});
const port = 7070;
server.listen(port, function() {
console.log(`Ajax server started on port ${port}`);
});
这段代码创建了一个非常简单的server,它可以说明当前使用的操作系统(“linux”“darwin”“win32”等)、Node.js的版本和server的启动时间。
Ajax引入了一个叫作跨资源共享(CORS- cross-origin resource sharing)的安全漏洞。在本例中,在header中将Access-Control-Allow-Origin的值设为*,这告诉客户端不要因为安全问题而阻止调用。在产品环境上,一般不会使用跟本地环境一样的网络协议、域名和端口号(默认允许访问任何端口),或指明可以访问endpoint的协议、域名和端口号。这里为了演示功能,禁用了CORS的检查。
运行下面这行命令可以启动server:
$ babel-node ajaxServer.js
在浏览器中打开http://localhost:7070 ,就可以看到server的输出。有了一个server之后,就可以在HTML页面(可以继续沿用本章中一直使用的那个页面)中编写Ajax代码了。首先在body中添加一个占位符,用来接收信息:
<div class="serverInfo">
Server is running on <span data-replace="platform">???</span>
with Node <span data-replace="nodeVersion">???</span>. It has
been up for <span data-replace="uptime">???</span> seconds.
</div>
这样就有了存放从server端获取到的数据的地方了,然后就可以使用XMLHttpRequest执行Ajax调用。在HMTL文件的最下面(在闭合标签
Ajax引入了一个叫作跨资源共享(CORS- cross-origin resource sharing)的安全漏洞。在本例中,在header中将Access-Control-Allow-Origin的值设为*,这告诉客户端不要因为安全问题而阻止调用。在产品环境上,一般不会使用跟本地环境一样的网络协议、域名和端口号(默认允许访问任何端口),或指明可以访问endpoint的协议、域名和端口号。这里为了演示功能,禁用了CORS的检查。