ajax技术详解
程序员文章站
2023-02-20 23:35:38
今天来讲一下ajax的有关知识点。 ajax概念 ajax全称叫 Asynchronous JavaScript and XML ,意思是异步的 JavaScript 和 XML。 ajax是现有标准的一种新方法,不是编程语言,可以在不刷新网页的情况下,和服务器交换数据并且更新部分页面内容,不需要任 ......
今天来讲一下ajax的有关知识点。
ajax概念
ajax全称叫asynchronous javascript and xml,意思是异步的 javascript 和 xml。
ajax是现有标准的一种新方法,不是编程语言,可以在不刷新网页的情况下,和服务器交换数据并且更新部分页面内容,不需要任何插件,只需要游览器允许运行javascript就可以。
而传统的网页(不使用ajax的)如果需要更新页面内容,就需要重新请求服务器,返回网页内容,重新渲染刷新页面。
ajax的原理
原理:ajax的运行过程包括以下几个方面
- browser游览器通过事件触发方法,本地通过
xmlhttprequest
对象,创建并且发送请求通过互联网到服务器; - server服务器收到请求的内容,响应请求,发送所需数据到游览器;
- browser游览器通过
xmlhttprequest
对象的onreadystatechange
的方法收到请求的数据后,解析和渲染数据到页面中。
注意:ajax依赖的标准有以下几个
- xmlhttprequest对象,异步的与服务器交换数据
- javascript/dom,信息显示/交互
- xml,作为转换数据的格式
xmlhttprequest的使用
创建xmlhttprequest
对象,通过new
实例化一个xmlhttprequest
对象。
var xhr = new xmlhttprequest() || new activexobject('microsoft.xmlhttp'); // 兼容ie和firefox,google chrome,opera,safari
发送请求使用xmlhttprequest
对象的open
和send
方法
open方法使用
open(method,url,async)
,接受三个参数。
- 第一个是method请求的类型,如:
get
和post
; - 第二个是url请求地址,即文件在服务器的位置;
- 第三个是是否处理异步处理请求,值为true和false;
例如:
xhr.open('get','https://www.abc.com/service.php?tamp='+date.parse(new date()),true);
send方法使用
send(string)
接受的参数为请求类型为post传递的值,为get类型时候不传值。
例如:
send('tamp='+date.parse(new date());
onreadystatechange事件
当readystate属性发生变化时,就会触发onreadystatechange事件,该事件通过回调函数获取到响应的数据信息。
readystate值:
- 值为0表示:请求未初始化;
- 值为1表示:服务器连接已建立;
- 值为2表示:请求已接收;
- 值为3表示:请求处理中;
- 值为4表示:请求已完成,且响应已就绪;
status值:
- 200: 请求成功
- 404: 未找到页面
简单的get请求。
var xhr; if (!xhr && typeof xhr !== 'object') { var xhr = new xmlhttprequest() || new activexobject('microsoft.xmlhttp'); } xhr.open('get','https://www.abc.com/service.php?tamp='+date.parse(new date()),true); xhr.onreadystatechange = function() { if (xhr.readystate === 4) { if (xhr.status === 200) { console.log(xhr.responsetext); } } } xhr.send();
模拟数据
模拟的json数据
// 保存为data.json文件 { "msg": "get_succ", "code": 201, "data": { "list": [ { "id":1, "name": "alun" }, { "id":2, "name": "mark" }, { "id":3, "name": "jean" } ] } }
模拟的nodejs的api
请确保你的系统安装有node.js环境。
// 保存为node.js文件 // 引入http模块 const http = require('http'); const port = 3000; const success = { msg: "get_succ", code: 201, data: { list: [ {"id":1,"name": "alun"}, {"id":2,"name": "mark"}, {"id":3,"name": "jean"} ] } } const error = { msg: "get_fail", code: 101, data: { info: 'this request failed,again try!' } } const authy = { msg: "no visited!", code: 403, data: { info: 'not visited!' } } // 建立http服务 const serve = http.createserver((req,res) => { var lawdomainlist = "http://localhost:9925"; res.setheader('content-type', 'text/plain;charset=utf8'); res.setheader("access-control-allow-origin",lawdomainlist); if (req.url == '/api') { res.end(json.stringify(success)); } else { res.end(json.stringify(error)); } res.end(authy); }) // 监听端口 serve.listen(port,function(){ console.log('serve is running on port 3000!'); })
封装的ajax函数
// 保存为ajax.js文件 $g = { get: function(url) { return new promise(function(resolve,reject) { if (!url && !(typeof url == 'string')) { throw new error('sysantaxerror: this get request must had url!'); } var xhr = new xmlhttprequest() || new activexobject('microsoft.xmlhttp'); xhr.open('get',url,true); xhr.onreadystatechange = function() { if (this.readystate === 4) { if (this.status === 200) { resolve(this.responsetext,this); } else { var resjson = { code: this.status, response: this.response } reject(resjson, this) } } } xhr.send(); }) }, post: function(url,data) { return new promise(function(resolve,reject) { if (!url) { throw new error('sysantaxerror: this post request must had url!'); } if (!data) { throw new error('sysantaxerror: this post request must had data!'); } var xhr = new xmlhttprequest() || new activexobject('microsoft.xmlhttp'); xhr.open('post',url,true); xhr.setrequestheader('content-type','application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (this.readystate === 4) { if (this.status === 200) { resolve(this.responsetext,this); } else { var resjson = { code: this.status, response: this.response } reject(resjson, this) } } } xhr.send(json.stringify(data)); }) } }
示例:获取数据渲染页面
通过点击按钮获取数据,渲染列表。
<button class="btn">请求数据</button> <ul class="res">结果:暂无结果</ul> <script src="ajax.js"></script>
let btn = document.queryselector('.btn'); let resbox = document.queryselector('.res'); btn.onclick = function() { var url = 'http://localhost:3000/api'; // node api var urljson = 'data.json'; // mock api $g.get(url).then(function(res) { if (typeof res == 'string') { let respontxt = json.parse(res); if (respontxt.msg == 'get_succ' && respontxt.code == 201) { let list = respontxt.data.list; let str = ''; for (let i=0;i<list.length;i++) { str += '<li>'+ list[i].id + ':' + list[i].name + '</li>'; } resbox.innerhtml = str; } } }).catch(function(err){ throw new error(err); }); }
写在最后
这只是我总结的一小部分知识点,其实这个技术还是有很多地方没有说到,以后再补充吧!
上一篇: 好想扎一下