ajax前后端交互原理(6)
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)的更多相关文章
- ajax前后端交互原理(5)
5.ajax简介 5.1.什么是ajax Asynchronous JavaScript and XML ,异步的javascript和XML 5.2.使用ajax有什么用 数据交互,可以从服务器获取 ...
- ajax前后端交互原理(1)
1.Node.js简介 1.1.前后台数据交互流程 在web开发中,我们经常听说前端和后台,他们分别是做什么具体工作的呢?他们怎样交互的呢?我们得把这些基础的问题都搞明白了,才有一个大致的学习方向,首 ...
- ajax前后端交互原理(7)
7.ajax函数封装 7.1.实例引入 需求: 每秒钟请求一次服务器 获取到数据 实现: 把ajax进行封装 <!DOCTYPE html> <html> <head&g ...
- ajax前后端交互原理(3)
3.HTTP服务器 3.3.相关前置知识 1 什么是url? 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的UR ...
- ajax前后端交互原理(4)
4.JSON 4.1 什么是JSON? JavaScript 对象表示法(JavaScript Object Notation)简称JSON,是一种轻量级的数据交换格式.虽然它基于JavaScript ...
- ajax前后端交互原理(2)
2.NPM使用 2.1.NPM是什么 NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,这里要搞清楚包的概念,通俗的说,包就是具有一定功能的工具(软件),本质 ...
- thinkphp+jquery+ajax前后端交互注册验证
thinkphp+jquery+ajax前后端交互注册验证,界面如下 register.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...
- SSM-网站后台管理系统制作(4)---Ajax前后端交互
前提:Ajax本身就为前后端交互服务的,实现功能:用户输入信息,实时判断用户的情况,这也是现在登录界面普遍流行的做法.前端js通过注释识别Controller层,该层查询返回,和之前Google验证码 ...
- JSON(及其在ajax前后端交互的过程)小识
一. json介绍 json是一种轻量级的数据交换格式,规则很简单: 并列的数据之间用逗号(,)分隔: 映射用冒号(:)表示: 并列数据的集合(数组)用方括号([])表示: 映射的集合(对象)用大括号 ...
随机推荐
- HttpServletRequest对象,请求行、请求头、请求体
HttpServletRequest 公共接口类HttpServletRequest继承自ServletRequest.客户端浏览器发出的请求被封装成为一个HttpServletRequest对象.对 ...
- Multiple annotations found at this line: - Undefined attribute name (charset).
把 meta charset="UTF-8" 改为 meta http-equiv="Content-Type" content="text/html ...
- Java实现 LeetCode 672 灯泡开关 Ⅱ(数学思路问题)
672. 灯泡开关 Ⅱ 现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮.在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态. 假设这 n 只灯泡被编号为 [1, 2 ...
- Java实现 蓝桥杯 算法训练 排序
算法训练 排序 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列. 输入格式:输入只有一行,即三个整数,中间用空格隔开. ...
- Java实现 蓝桥杯VIP 基础练习 完美的代价
package 蓝桥杯VIP; import java.util.Scanner; public class 完美的代价 { public static int sum = 0; public sta ...
- Java实现 蓝桥杯VIP 算法训练 输出米字形
例如:n=3时,包含A,B,C:n=4时,包含A,B,C,D. 矩阵的正中间为n个字母中字典序最大的那个,从这个字母开始,沿着西北.正北.东北.正西.正东.西南.正南.东南八个方向各有一条由大写字母组 ...
- Java实现 洛谷 P1023 税收与补贴问题
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner in = n ...
- .NET Core Session源码探究
前言 随着互联网的兴起,技术的整体架构设计思路有了质的提升,曾经Web开发必不可少的内置对象Session已经被慢慢的遗弃.主要原因有两点,一是Session依赖Cookie存放Session ...
- ClickHouse基本操作(一)
常用SQL 创建表 1 2 3 4 5 6 7 CREATE TABLE b6logs( eventDate Date, impid UInt64, uid String, idfa String, ...
- Python中class的三种继承方法
class parent(object): def implicit(self): print("Parent implicit()") def override(self): p ...