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. HTML元素跟随鼠标一起移动,网页中回到顶部按钮的实现

    对象跟随鼠标: 1.对象css设置绝对定位position: absolute; 2.获取鼠标坐标: 3.通过鼠标坐标计算出对象坐标位置,并设置为css定位的位置: document.onmousem ...

  2. java方法句柄-----5.Method Handles in Java

    Method Handles in Java 目录 Method Handles in Java 1.介绍 2.什么是MethodHandle 3. Method Handles vs Reflect ...

  3. Java实现 LeetCode 836 矩形重叠(暴力)

    836. 矩形重叠 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的 ...

  4. Java实现 蓝桥杯VIP 算法提高 P0401

    算法提高 P0401 时间限制:1.0s 内存限制:256.0MB 输入一个无符号整数x,输出x的二进制表示中1的个数. 输入: 76584 输出: 7 import java.util.Scanne ...

  5. 第三届蓝桥杯C++B组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.星期几 1949年的国庆节(10月1日)是星期六. 今年(2012)的国庆节是星期一. 那么,从建国到现在,有几次国庆节正好是星期日呢 ...

  6. Java实现 LeetCode 2 两数相加

    两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  7. java实现串中找数字

    串中找数字 以下的静态方法实现了:把串s中第一个出现的数字的值返回. 如果找不到数字,返回-1 例如: s = "abc24us43" 则返回2 s = "82445ad ...

  8. Java实现第九届蓝桥杯方格计数

    方格计数 题目描述 如图p1.png所示,在二维平面上有无数个1x1的小方格. 我们以某个小方格的一个顶点为圆心画一个半径为1000的圆. 你能计算出这个圆里有多少个完整的小方格吗? 注意:需要提交的 ...

  9. router路由配置

    vue项目中router路由配置   介绍 路由:控制组件之间的跳转,不会实现请求.不用页面刷新,直接跳转-切换组件>>> 安装 本地环境安装路由插件vue-router:    c ...

  10. 不需重新编译php,安装postgresql扩展(pgsql和pdo_pgsql)

    为了不重新编译php,使用phpize工具进行追加. 1.下载phpX安装包 访问php官方下载页,找到自己对应的php版本:https://secure.php.net/downloads.php ...