Ajax基础详解教程(二)_AJAX相关

在上篇文章给大家介绍了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 ); //弹出内容
}
}
} 

下面我们就讲到 ,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); //否则告知出错并弹出错误原因
}
}
} 

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

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

GET请求:

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

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

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

后台代码不变

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

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

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

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

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

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

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

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

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

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

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&'); 

无缓存问题,因为单单是往服务器提交数据,提交数据是不会被缓存的,获取数据才会被缓存。这就是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格式 

虽然后端输出的内容格式上是数组和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() {
var xhr = null;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
xhr.open('get','getNews.php',true);
xhr.send();
xhr.onreadystatechange = function() {
if ( xhr.readyState == 4 ) {
if ( xhr.status == 200 ) {
//alert( xhr.responseText ); 后端传来的格式是一个数组里面很多条json 自己可以测试下
var data = JSON.parse( xhr.responseText ); // 将后台获取的内容转为json类型 每一个json里面有两个键:title和date
var oUl = document.getElementById('ul1'); //获取显示新闻列表的节点
var html = '';
for (var i=0; i<data.length; i++) { // 循环所有的json数据,并把每一条添加到列表中
html += '<li><a href="">'+data[i].title+'</a> [<span>'+data[i].date+'</span>]</li>';
}
oUl.innerHTML = html; //把内容放在页面里
} else {
alert('出错了,Err:' + xhr.status);
}
}
}
}
}
</script>
</head>
<body>
<input type="button" value="按钮" id="btn" />
<ul id="ul1"></ul>
</body>
</html>
<?php
header('content-type:text/html;charset="utf-8"');
error_reporting(0);
$news = array(
array('title'=>'女总理默克尔滑雪时摔倒 骨盆断裂','date'=>'2014-1-6'),
array('title'=>'驻英外交官撰文互称对方国家为"伏地魔"','date'=>'2014-1-6'),
array('title'=>'安倍:望与中国领导人会面 中方:你关闭了大门','date'=>'2014-1-6'),
array('title'=>'揭秘台湾驻港间谍网运作 湖北宜昌副市长被查','date'=>'2014-1-6'),
array('title'=>':嫦娥三号是货真价实的中国创造','date'=>'2014-1-6'),
);
echo json_encode($news); 

好了今天的Ajax就唠到这,希望大家有所收获,如果有错误的希望大家指正,看到好多人看头像进来的,伦家真是不知道说什么,还是希望大家能理性多提点意见拉拉,下次会讲下对于Ajax的封装,以及一些实际应用。

以上所述是小编给大家介绍的Ajax基础详解教程(二)的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ajax详解
ajax基础教程 pdf、ajax基础教程、ajax基础教程 pdf下载、ajax与php基础教程、ajax基础视频教程云盘,以便于您获取更多的相关知识。

时间: 2024-08-03 07:35:13

Ajax基础详解教程(二)_AJAX相关的相关文章

Ajax基础详解教程(一)_AJAX相关

什么是Ajax? 在研究ajax之前首先让我们先来讨论一个问题 --什么是Web 2.0 .听到 Web 2.0 这个词的时候,应该首先问一问 "Web 1.0 是什么?" 虽然很少听人提到 Web 1.0,实际上它指的就是具有完全不同的请求和响应模型的传统 Web.比如,到 hdu.edu.cn 网站上点击一个按钮.就会对服务器发送一个请求,然后响应再返回到浏览器.该请求不仅仅是新内容和项目列表,而是另一个完整的 HTML 页面.因此当 Web 浏览器用新的 HTML 页面重绘时,可

jQuery Ajax 实例详解 ($.ajax、$.post、$.get)_AJAX相关

Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作,不用考虑浏览器的诧异了. 推荐一篇不错的jQuery Ajax 实例文章,忘记了可以去看看, 地址为:http://www.jb51.net/article/26903.htm $.post.$.get是一些简单的方法,如果要处理复杂的逻辑,还是需要用到jQuery.ajax() 一.$.ajax的一般格式 $.ajax({ type: 'POST', url: url , data: data ,

$.ajax()常用方法详解(推荐)_AJAX相关

AJAX 是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分.接下来通过本文给大家介绍ajax一些常用方法,大家有需要可以一起学习. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持. 3.timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆

WebService教程详解(二)_java

在上篇文章给大家介绍了WebService教程详解(一) 使用工具的原因: 1. 使用工具可以更好的了解WebService请求的过程 2. 使用工具WsExplore可以获取SOAP数据发送和接收的格式 3. 使用工具Tcp/Ip Monitor可以监控拦截器请求头和响应头的具体数据 什么是SOAP? SOAP是一种基于XML编码规范的文本协议,简单的说SOAP就是在HTTP的基础上传输XML数据,以实现远程调用[无论你的服务端是什么语言书写的,只要接收SOAP协议的XML数据,并返回SOAP

Android开发时在模拟器之间短信的收发详解教程

本文通过运行两个Android模拟器,介绍在Android中如何实现短信服务(SMS,short message service)的功能.通过这个例子,我想带给大家的是:更加熟悉之前介绍过的Android应用程序的概念及技术细节,且通过实例调度大家的兴趣.我之所以选择SMS为例子,主要原因是SMS已经非常成熟了,从中可以发掘更多的信息和技术细节,而且我相信大部分人发短信比打电话多. 1.温故知新 广播接收者:一个广播接收者是这样一个组件,它不做什么事,仅是接受广播公告并作出相应的反应.许多广播源

Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSDK分享组件的,奈何需要去注册各平台的账号,还要审核,有些审核还挺久,就没办法,改为写这个Bmob了,相信大家对Bmob都是挺期待的吧,因为他作为Android后端的实现很好的支持,国内很多软件都在使用它,他的功能也是特别神奇,这里就不一一细说了,我们用实际的例子来见证他的神奇 官网:http://w

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)  [顶]ORACLE PL/SQL编程详解之二:   PL/SQL块结构和组成元素(为山九仞,岂一日之功)     继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不

基于PHP+jQuery注册模块开发详解教程

/* ******* 环境: Apache2.2.8 + PHP5.2.6 + MySQL5.0.51b + jQuery-1.8.3.min.js ******* ******* 其他组件:Zend_mail( Zend_framework 1.11.11 ) ******* Date:2014-09-25 ******* Author:小dee */ 了一个简单的PHP+jQuery注册模块,需要填写的栏目包括用户名.邮箱.密码.重复密码和验证码,其中每个栏目需要具备的功能和要求如下图: 开

linux多线程编程详解教程

 这篇文章主要介绍了linux多线程编程详解教程,提供线程通过信号量实现通信的代码,大家参考使用吧 线程分类   线程按照其调度者可以分为用户级线程和核心级线程两种.   (1)用户级线程  用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持.在这里,操作系统往往会提供一个用户空间的线程库,该线程库提供了线程的创建.调度.撤销等功能,而内核仍然仅对进程进行管理.如果一个进程中的某一个线程调用了一个阻塞的系统调用,那么该进程包括该进程