6.XMLHttpRequest对象

XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。

6.1.创建XMLHttpRequest对象

6.1.1 XMLHttpRequest兼容性问题

XMLHttpRequest在ie6以下是以插件的形式来使用的,没有内置在浏览器中,所以在ie6以下不能通过new XMLHttpRequest的形式来使用,在ie下可以通过new ActiveObject("Microsoft.XMLHTTP")来使用,因此,可以写出这样:

 var xhr = null;
if(window.XMLHttpRequest){ //标准模式下
xhr = new XMLHttpRequest();
}else{//ie6以下走这里
xhr = new ActiveXobject('Microsoft.XMLHTTP');
}

在很多地方也通过异常处理的形式来处理兼容。try...catch...finally语句语法结构:

try{
//尝试着执行这段代码 如果有错就执行catch里面的代码
}catch(e){
//try里面的错误信息都会被存放在 参数e里面
}finally{
//不管是否有错最终都要执行这段代码 通常这里都不写 只是 try catch的组合
}
try{
sdfs;
alert(1);
}catch(e){
alert(2);
}finally{
alert(3)
}
//执行结果 先弹2 再弹3 try里面的语句报错

ajax对象兼容性写法:

var xhr = null ;
try{//标准下不会报错 执行这里的代码
xhr = new XMLHttpRequest();
}catch(e){
xhr = new ActiveXObject('Microsoft.XMLHTTP') //ie下try里面的语句错误 执行这里的代码
}

6.2.open 方法

open方法和表单提交数据很相似

表单提交数据:
action: 数据提交的地址,如果不写,默认提交到当前页面
method: 数据提交的方式,有get和post两种方式,默认使用get方式,url长度有限制,所以不要通过
get方式传递过长的数据,post方式理论上没有长度限制,但是可以通过修改配置文件设置长度
enctype: 提交数据的格式,默认提交数据格式为:enctype="application/x-www-form-urlencoded"

open方法语法:

xhr.open("get","01.txt",true);
xhr为创建好的ajax对象
第一个参数: 打开方式,这里的打开方式跟表单差不多,有get和post两种方式,相当于method
第二个参数: 打开的地址,这里就相当于表单里的acthion属性
第三个参数: 是否异步
同步:阻塞模式,当前一条代码会影响后面代码执行
异步:非阻塞模式,前面的 代码不会影响后面代码的执行

6.3.发送和获取数据

通过send方法发送数据,通过监听readystatechange事件来获取数据

	//发送请求---->相当于点击回车键发送的过程
xhr.send();
//监听请求状态--->发送以后等待返回数据,网站展现出来
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
alert(xhr.responseText);
}
}

responseText: 服务器返回的数据会存放到ajax对象的一个responseText属性中 readyState:表示ajax的工作状态,一共有5个状态

            状态0: 表示ajax对象创建成功(初始化),但是还没有调用open方法
状态1:表示已调用send方法,正在发送数据(载入数据)
状态2:send方法发送完成,已经收到响应内容(载入完成)
状态3:表示正在解析内容(解析)(注:收到响应内容后,还需要解析内容)
状态4:响应内容解析完成,可以使用数据了(注:状态为4的时候说明所有流程已经完成,拿到数据了)

onreadyStatechang:这个事件用来监听ajax工作状态的,可能会被触发多次,表示当状态发生改变的时候被触发

status: 表示服务器的状态码

通过以上几个属性的了解后,ajax获取数据时的容错处理可以写成这样:

xhr.onreadystatechange = function(){

	if(xhr.readyState == 4 ){
if(xhr.status == 200){
alert(xhr.responseText);
}else{
alert("出错了:"+xhr.status);
} }
}

6.4.带数据情况的处理

get方式发送数据,数据是放在url地址里面发送过去的,在ajax中也通过这种形式传送数据

//创建ajax对象 ---->相当于打开浏览器
var xhr = new XMLHttpRequest();
//打开要获取文件的地址---->相当于输入网址
xhr.open('get','/getData?username=xiaoqiang&age=19',true);
//发送请求---->相当于点击回车键发送的过程
xhr.send();
//监听请求状态--->发送以后等待返回数据,网站展现出来
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
alert(xhr.responseText);
}
}

注意: 通过get方式发送请求在ie下会出现两个问题,第一个就是缓存问题 第二就是乱码问题,需要通过encodeURI()进行转码发送

post方式发送请求数据,数据是放在请求体里面传送过去的,在ajax中,数据放在send方法中传送过去,并且要设置请求头的类型

//创建ajax对象 ---->相当于打开浏览器
var xhr = new XMLHttpRequest();
//打开要获取文件的地址---->相当于输入网址
xhr.open('post','/getData',true);
//发送请求---->相当于点击回车键发送的过程
xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");
xhr.send('username=xiaoqiang&age=19');
//监听请求状态--->发送以后等待返回数据,网站展现出来
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
alert(xhr.responseText);
}
}

举个栗子: 1 ajax版用户登录认证

login.html文件内容

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.msg{
color: red;
}
</style>
</head>
<body>
<form action="">
用户名: <input type="text" id="username"> <span class="msg"></span><br />
密码: <input type="password" id="password"> <br />
<input type="button" value="登录" id="btn">
</form>
<script>
var oBtn = document.getElementById("btn");
var oUser = document.getElementById('username');
var oPass = document.getElementById('password');
var oSpan = document.getElementsByClassName('msg')[0];
oBtn.onclick = function () {
var xhr = null;
try {
xhr = new XMLHttpRequest();
}catch(e){
xhr = new ActiveXobject('Microsoft.XMLHTTP');
}
xhr.open('post', '/login', true);
xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
xhr.send('username='+oUser.value+'&password='+oPass.value);
xhr.onreadystatechange = function () {
if(xhr.status === 200 && xhr.readyState === 4){
var obj = JSON.parse(xhr.responseText);
if(obj.status === 0){
alert(obj.message);
window.location.href = 'http://nodeing.com';
}else{
oSpan.innerHTML = obj.message;
} }
}
}
</script>
</body>
</html>

服务器端index.js中的代码

var http = require('http');
var url = require('url');
var fs = require('fs');
var querystring = require('querystring');
var app = http.createServer(function (req, res) {
res.setHeader('content-type', 'text/html;charset=utf-8');
var url_obj = url.parse(req.url);
if(url_obj.pathname === '/login' && req.method==='GET'){
fs.readFile('./login.html','utf-8', function (err, data) {
if(!err){
res.write(data);
res.end();
}
})
}
// 处理ajax请求
if(url_obj.pathname === '/login' && req.method === 'POST'){
console.log(1);
var post_data = '';
req.on('data', function (chunk) {
post_data += chunk;
});
req.on('end', function () {
var post_obj = querystring.parse(post_data);
if(post_obj.username === 'admin' && post_obj.password === '123456'){
res.write('{"status":0, "message":"登录成功"}'); }else{
res.write('{"status":1, "message":"用户名或者密码错误"}');
}
res.end();
})
}
});
app.listen(3000);

2 获取后台数据

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
window.onload = function(){
var oBtn = document.getElementById("btn");
oBtn.onclick = function(){
//创建ajax对象
var xhr = null;
try{
xhr = new XMLHttpRequest();
}catch(e){
xhr = new ActiveXobject('Microsoft.XMLHTTP');
}
//打开要获取文件的地址
xhr.open('get','/getdata',true);
//发送请求
xhr.send();
//alert(xhr.responseText);
//监听请求状态
xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status==200){
var data = JSON.parse(xhr.responseText);
var oUl = document.getElementById('ul1');
for(var i=0;i<data.length;i++){
var oli = document.createElement('li');
oli.innerHTML = data[i].title+'['+data[i].time+']';
oUl.appendChild(oli);
} }
}
}
}
</script>
</head>
<body>
<input type="button" id="btn" value="获取数据" />
<ul id="ul1"> </ul>
</body>
</html>

app.js 代码:

var http = require('http');
var url = require('url');
var fs = require('fs');
var app = http.createServer(function (req, res) {
res.setHeader('content-type', 'text/html;charset=utf-8');
var url_obj = url.parse(req.url);
if(url_obj.pathname === '/'){
fs.readFile('./index.html','utf-8', function (err, data) {
if(!err){
res.write(data);
res.end();
}
})
}
// 处理ajax请求
if(url_obj.pathname === '/getdata'){
var arr = '[' +
'{"title":"习主席出席国家科学技术奖励大会1","time":"'+new Date().toLocaleDateString()+'"},' +
'{"title":"习主席出席国家科学技术奖励大会2","time":"'+new Date().toLocaleDateString()+'"},' +
'{"title":"习主席出席国家科学技术奖励大会3","time":"'+new Date().toLocaleDateString()+'"},' +
'{"title":"习主席出席国家科学技术奖励大会4","time":"'+new Date().toLocaleDateString()+'"}' +
']';
res.write(arr);
res.end();
}
});
app.listen(3000);

螺钉课堂视频课程地址:http://edu.nodeing.com

ajax前后端交互原理(6)的更多相关文章

  1. ajax前后端交互原理(5)

    5.ajax简介 5.1.什么是ajax Asynchronous JavaScript and XML ,异步的javascript和XML 5.2.使用ajax有什么用 数据交互,可以从服务器获取 ...

  2. ajax前后端交互原理(1)

    1.Node.js简介 1.1.前后台数据交互流程 在web开发中,我们经常听说前端和后台,他们分别是做什么具体工作的呢?他们怎样交互的呢?我们得把这些基础的问题都搞明白了,才有一个大致的学习方向,首 ...

  3. ajax前后端交互原理(7)

    7.ajax函数封装 7.1.实例引入 需求: 每秒钟请求一次服务器 获取到数据 实现: 把ajax进行封装 <!DOCTYPE html> <html> <head&g ...

  4. ajax前后端交互原理(3)

    3.HTTP服务器 3.3.相关前置知识 1 什么是url? 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的UR ...

  5. ajax前后端交互原理(4)

    4.JSON 4.1 什么是JSON? JavaScript 对象表示法(JavaScript Object Notation)简称JSON,是一种轻量级的数据交换格式.虽然它基于JavaScript ...

  6. ajax前后端交互原理(2)

    2.NPM使用 2.1.NPM是什么 NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,这里要搞清楚包的概念,通俗的说,包就是具有一定功能的工具(软件),本质 ...

  7. thinkphp+jquery+ajax前后端交互注册验证

    thinkphp+jquery+ajax前后端交互注册验证,界面如下 register.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  8. SSM-网站后台管理系统制作(4)---Ajax前后端交互

    前提:Ajax本身就为前后端交互服务的,实现功能:用户输入信息,实时判断用户的情况,这也是现在登录界面普遍流行的做法.前端js通过注释识别Controller层,该层查询返回,和之前Google验证码 ...

  9. JSON(及其在ajax前后端交互的过程)小识

    一. json介绍 json是一种轻量级的数据交换格式,规则很简单: 并列的数据之间用逗号(,)分隔: 映射用冒号(:)表示: 并列数据的集合(数组)用方括号([])表示: 映射的集合(对象)用大括号 ...

随机推荐

  1. Chisel3 - bind - Binding

    https://mp.weixin.qq.com/s/2318e6VJ4wFGpWwBOmTikA   Chisel数据类型(Data)与Module的绑定关系,根据Data的使用方式不同,而有多种绑 ...

  2. Java实现 LeetCode 820 单词的压缩编码(字典树)

    820. 单词的压缩编码 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", & ...

  3. Java实现 LeetCode 416 分割等和子集

    416. 分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: ...

  4. Java实现 蓝桥杯 算法提高 最长滑雪道

    试题 算法提高 最长滑雪道 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小袁非常喜欢滑雪, 因为滑雪很刺激.为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上 ...

  5. 还在用SimpleDateFormat格式化时间?小心经理锤你

    还在用SimpleDateFormat格式化时间?小心经理锤你 场景 本来开开心心的周末时光,线上突然就疯狂报错,以为程序炸了,截停日志,发现是就是类似下述一段错误 java.lang.NumberF ...

  6. zabbix 大流量断图

    一. 环境介绍 系统版本:Centos7.4 zabbix-agent 版本:zabbix-agent 3.4.7   二. 问题现象 在使用zabbix的snmp方式的监控端口流量时,某一个图总是断 ...

  7. TCP协议“三次握手”与“四次挥手”详解(下)

    前面进行“三次握手”建立连接后,当客户端的数据发送完毕,它就会要求与服务器端断开连接,那么就要进行“四次挥手”进行连接的释放. 注意,此处所谓的“客户端”与“服务器端”,只是为了方便标识连接的双方,即 ...

  8. vue2.0+Element UI 表格前端分页和后端分页

    之前写过一篇博客,当时对element ui框架还不太了解,分页组件用 html + css 自己写的,比较麻烦,而且只提到了后端分页 (见 https://www.cnblogs.com/zdd20 ...

  9. throws,throw,try,catch,finally 分别代表什么 意义?

    Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口. 在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例.当一个方法出现异常后便 抛出一个异 ...

  10. 【 转】百度地图Canvas实现十万CAD数据秒级加载

    Github上看到: https://github.com/lcosmos/map-canvas 这个实现台风轨迹,这个数据量非常庞大,当时打开时,看到这么多数据加载很快,感到有点震惊,然后自己研究了 ...