• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >AJAX > Ajax基础详解教程(二)

Ajax基础详解教程(二)

作者:沫晴的前端世界 字体:[增加 减小] 来源:互联网 时间:2017-05-11

沫晴的前端世界通过本文主要向大家介绍了Ajax基础详解教程(二)等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在上篇文章给大家介绍了Ajax基础详解教程(一),讲到Ajax中open方法的第三个参数异步和同步的问题,今天呢,就来继续往下唠,先接着上回的代码

var oBtn = document.getElementById('btn');
oBtn.onclick = function(){
var xhr = null;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject(‘Microsoft.XMLHTTP');
}
xhr.open('get','1.txt',true); //设置请求信息 
xhr.send();//提交请求
//等待服务器返回内容 
xhr.onreadystatechange = function() { 
if ( xhr.readyState == 4 ) { //如果内容响应成功,并解析完成
alert( xhr.responseText ); //弹出内容 
} 
}
} 
</div>

下面我们就讲到 ,xhr.send();这一句呢才是真正请求数据的,open方法只是设置了一些请求参数。

现在呢请求递交了,就等服务器回应了,这个时候Ajax的一个属性就要登场了,那就是 responseText ,ajax请求返回的内容都放在了这里面,而且不管你请求的内容是什么,这里存放的都是是字符串类型。

当然我们上文也提到了,要想用异步请求呢,这里需要条件判断才知道服务端对请求的内容是否响应完毕,这个时候另一个属性就要登场了,readyState,他代表着Ajax请求过程的不同的状态,参数如下:

0 (初始化)还没有调用open()方法
1 (载入)已调用send()方法,正在发送请求
2 (载入完成)send()方法完成,已收到全部响应内容
3 (解析)正在解析响应内容(因为收到的内容 并不是人能看懂的内容,所以需要解析)
4 (完成)响应内容解析完成,可以在客户端调用了

由上我们可以得到,在状态2的时候已经回应了请求的内容了,但是这个内容我们人看不懂撒,机器才懂,所以就有3,帮我们解析这个内容,然后解析完成就变成4了,这个时候的内容,咱们前端就可以用了。

状态是有了,可咱们怎么能知道啥时候是啥状态呢,这个时候我们就要用到一个监控状态的事件了onreadystatechange事件,当状态值改变的时候触发会触发这个事件,所以当状态为4的时候我们再弹出内容。

上面的代码基本已经了解了原理,不过当然不是最完善的,这个时候,我们虽然监控到了状态,响应了内容,但是内容不一定就是对的呀,比如可能内容出错了,可能我们请求了一个不存在的页面,这个时候readyState是无法判断错误的,我们需要知道内容是否正常,这个时候另一个属性 status属性就登场了,它代表的不是Ajax状态,而是服务器(请求资源)的状态, http状态码。状态码有很多,其中比较出名的就是200,成功状态码,和404 Not Found.其他的大家私下自行查阅。这里可以看到。

所以我们的代码要做进一步的改进

var oBtn = document.getElementById('btn');
oBtn.onclick = function(){
var xhr = null;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
xhr.open('get','1.txt',true); //设置请求信息 
xhr.send();//提交请求
//等待服务器返回内容 
xhr.onreadystatechange = function() { 
if ( xhr.readyState == 4 ) { 
if(xhr.status == 200) {//如果响应成功,并且服务器相应内容正确
alert( xhr.responseText );//弹出内容 
}else{alert('出错了' + xhr.status); //否则告知出错并弹出错误原因
} 
}
} 
</div>

Ajax的大概流程就是这样的。当然还存在一些细节方面的问题需要注意的,继续往下看把。

工作当中 向后端传递数据存在的问题:

GET请求:

1 缓存问题:后台更改了 因网址未变 所以会去缓存提取内容 而不是后台

来看个栗子:假如我们要点击按钮弹出名字和年龄,因为GET请求是通过数值串连然后在网址传递数据的,所以我们的open方法可以直接这样写:

xhr.open('get','1.get.php?username=沐晴&age=21',true); 
</div>

后台代码不变

<?php
header('content-type:text/html;charset="utf-8"'); //设置编码格式,以及文档类型
error_reporting(0);
$username = $_GET['username'];//获取get请求方式的数据
$age = $_GET['age'];
echo "你的名字:{$username},年龄:{$age}"; //输出内容
</div>

现在点击肯定会弹出你的名字沐晴,年龄21 了。

这个时候呢,浏览器会有一个缓存,如果下次访问相同的网址,就会从缓存里取。

比如我现在想弹出,欢迎你,你的名字沐晴,年龄21,

echo "欢迎,你的名字:{$username},年龄:{$age}"; //输出内容 
</div>

虽然后台代码变了,但是GET请求访问网址依然是 1.get.php?username=沐晴&age=21,所以后台会去浏览器缓存找,结果弹出的还是原来的。大家可以自行测试。

所以,这个时候我们需要解决缓存问题。既然访问网址不变的话会去找缓存,那么我们让网址一直变不就好了。所以我们可以在后面加个一直变化的变量,比如系统事件,或者加一个随机数都行,像下面这样:

xhr.open('get','1.get.php?username=沐晴&age=21&'+new.Date.getTime(),true); 
</div>

这样就不会存在缓存问题了。有些人会这样写,会在后面给它起个名字t,这个时候如果后台也有个变量叫t,可能就会出问题了,所以不是很推荐。

xhr.open('get','1.get.php?username=沐晴&age=21&t='+new.Date.getTime(),true); 
</div>

post 请求

1 上节课我们知道,在表单里面传统方式POST请求的内容是放在请求头里的,那么Ajax是放在哪里的呢?

post 数据放在send里面作为参数传递。

2 还有一点是,我们上次我们知道表单里面的第三个参数:enctype: 提交的数据格式,默认是application/x-www-form-urlencoded,但是在Ajax中,你不写就没有,没有默认值,所以我们需要在请求头里面指定提交的数据格式,不然浏览器不知道用哪种格式解析。

所以post请求需要设置下面这两句

xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
xhr.send('username=沐晴&age=21&'); 
</div>

无缓存问题,因为单单是往服务器提交数据,提交数据是不会被缓存的,获取数据才会被缓存。这就是web的机制。

前面讲的都是请求数据,现在来看一下后端接收请求,然后响应给我们的内容。

先看看后端对数据的处理:后端的数据类型也是很多的,我们不能直接把这样的数据给前端吧,所以后端也需要做一定的处理,它有个方法 json_encode 可以根据数据类型不同,然后输出不同格式。看下面的栗子

<?php
header('content-type:text/html;charset="utf-8"');
error_reporting(0);
$arr1 = array('le','mo'); // 索引类型的数据
$arr2 = array('username'=>'le','age'=>32); // 2 对应关系的数据
echo json_encode($arr1); // ["le","mo"] 索引类型 输出为数组格式
echo json_encode($arr2); // {"username":"le","age":32} 对应关系的数据 输出为json格式 
</div>

虽然后端输出的内容格式上是数组和json但是我之前提到过 alert( xhr.responseText );//这里弹出的可都是字符串类型,所以尽管格式上看着是json和数组,但实际的数据类型还是字符串。

所以我们前端要对这些字符串进行转换。这个时候就用到了两个方法

1 stringify() : 把json对象转化成字符串 转换后的字符串是严格的json格式

2 parse() : 把字符串转成对象,可以把后端返回的字符串 转成JSON格式,对于json,只能转换严格json格式的字符串,字符串的键 比较用双引号括起来 像这样 {"username":"le","age":32}

下面来看个实际的案例:

需求:点击页面按钮,实现页面不刷新,在下面显示新闻列表 看注释应该能看懂

<!DOCTYPE HTML>
<html>
<head>
<meta charset=utf-8">
<title>无标题文档</title>
<!--<script src="jquery.js"></script>-->
<script>
window.onload = function() {
var oBtn = document.getElementById('btn'); 
oBtn.onclick = function() 



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-11ajax局部刷新实例 (三种方法推荐)
  • 2017-05-11基于Ajax技术实现文件上传带进度条
  • 2017-05-11ajax回调函数参数传递正确方法
  • 2017-05-11浅谈AJAX开发技术
  • 2017-05-11通达OA 使用Ajax和工作流插件实现根据人力资源系统数据增加OA账号(图文详解)
  • 2017-05-11AJAX技术框架及开发工具
  • 2017-05-11Django框架如何使用ajax的post方法
  • 2017-05-11如何解决Ajax访问不断变化的session的值不一致以及HTTP协议中的GET、POST的区别
  • 2017-05-11使用jQuery简化Ajax开发
  • 2017-05-11js统计网页在线时间的脚本

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 使用加载图片解决在Ajax数据加载中页面出现短暂空白的问题(推荐)
    • ajax异步请求刷新
    • SpringMVC环境下实现的Ajax异步请求JSON格式数据
    • AJAX和JSP混合使用方法实例
    • 使用ajax技术实现txt弹出在页面上的方法
    • 解决AJAX请求中含有数组的办法
    • AJAX级联下拉框的简单实现案例
    • SSH网上商城之使用ajax完成用户名是否存在异步校验
    • Ajax留言本源码 提供下载了
    • Ajax提交Form表单及文件上传的实例代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有