AJAX技术示例,Web前端后端实现
AJAX的全称是Asynchronous JavaScript and XML,是一种利用Javascript在web前端请求后端数据的技术,可以在不需要重新加载整个网页的情况下,实现从后端获取数据,更新部分网页内容。
我的理解,实际上就是可以利用javascript代码,异步的发起web请求,接收数据并展示。
我是2020年才开始正式接触的前端开发,目前基本在使用框架,平时并不会直接写AJAX。但是我觉得作为一个前端开发者,了解AJAX是必要的,因此学了一下。
学习AJAX可以看W3School的教程:AJAX 简介
下面是AJAX的实现,后端采用的Egg.js。
这个示例可以实现不同类型的AJAX请求,包含同步,异步,GET/POST,XML
点击不同类型的请求,除了看到文字更新之外,在谷歌浏览器的Network里面还可以看到每一次AJAX请求,点击可以看到具体细节。
首先是前端代码 index.html:
html
<html>
<head>
<script type="text/javascript">
const xmlhttp = new XMLHttpRequest();
function respond () {
console.log(xmlhttp);
if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
document.getElementById('myDiv').innerHTML = xmlhttp.responseText;
}
}
function loadXMLDoc() {
xmlhttp.onreadystatechange = respond
xmlhttp.open('GET', 'data?a=send1&b=2', true);
xmlhttp.send();
}
function loadXMLDocSync() {
xmlhttp.open('GET', 'data', false);
xmlhttp.send();
document.getElementById('myDiv').innerHTML = xmlhttp.responseText;
}
function loadXMLDocPost() {
xmlhttp.onreadystatechange = respond
xmlhttp.open('POST', 'data', true);
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.send('a=send2&b=2');
}
function loadXMLDocXML() {
xmlhttp.onreadystatechange = function () {
console.log(xmlhttp);
if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
const titles = xmlhttp.responseXML.getElementsByTagName('title');
let txt = '';
for (let t of titles) {
console.log(t.childNodes)
txt += t.childNodes[0].nodeValue + '<br />';
}
document.getElementById('myDiv').innerHTML = txt;
}
}
xmlhttp.open('GET', 'dataxml', true);
xmlhttp.send();
}
</script>
</head>
<body>
<div id="myDiv">
<h3>
Let AJAX change this text
</h3>
</div>
<button type="button" onclick="loadXMLDoc()">
AJAX GET请求
</button>
<button type="button" onclick="loadXMLDocSync()">
AJAX 同步GET请求
</button>
<button type="button" onclick="loadXMLDocPost()">
AJAX POST请求
</button>
<button type="button" onclick="loadXMLDocXML()">
AJAX XML请求
</button>
</body>
</html>
后端:
js
'use strict';
const Controller = require('egg').Controller;
const fs = require('fs');
const path = require('path');
class HomeController extends Controller {
async index() {
const { ctx } = this;
await ctx.render('index.html');
}
async data() {
const { ctx } = this;
console.log(ctx.query);
ctx.body = ctx.query.a + 'data';
}
async datapost() {
const { ctx } = this;
// console.log(ctx.request, ctx.request.body);
ctx.body = ctx.request.body.a + 'data';
}
async dataxml() {
const { ctx } = this;
ctx.set('Content-Type', 'text/xml');
console.log(this.app.config.view.root[0]);
ctx.body = fs.readFileSync(path.join(this.app.config.view.root[0], 'data.xml'));
}
}
module.exports = HomeController;
js
'use strict';
/**
* @param {Egg.Application} app - egg application
*/
module.exports = app => {
const { router, controller } = app;
router.get('/', controller.home.index);
router.get('/data', controller.home.data);
router.post('/data', controller.home.datapost);
router.get('/dataxml', controller.home.dataxml);
};
xml文件
xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Copyright w3school.com.cn -->
<!-- W3School.com.cn bookstore example -->
<bookstore>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
</bookstore>
Node.js部分config
js
config.view = {
root: path.join(appInfo.baseDir, 'app/view'),
mapping: {
'.html': 'nunjucks',
},
};
config.security = {
csrf: {
enable: false,
},
};