javascript学习笔记(七)Ajax和Http状态码


Posted in Javascript onOctober 08, 2014

Ajax及其工作原理

AJAX 是一种与服务器交换数据无需刷新网页的技术,最早由Google公司在谷歌地图里使用,并迅速风靡。

AJAX是不能跨域的,如需跨域,可以使用document.domain='a.com';或者使用服务器代理,代理XMLHttpRequest文件

AJAX是基于现有的Internet标准,并且联合使用它们:

XMLHttpRequest 对象 (异步的与服务器交换数据)
JavaScript/DOM (信息显示/交互)
CSS (给数据定义样式)
XML (作为转换数据的格式)

javascript学习笔记(七)Ajax和Http状态码

创建 XMLHttpRequest 对象

所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。

创建Ajax对象:

//IE6以上
var oAjax = new XMLHttpRequest();

//IE6
var oAjax =new ActiveXObject("Microsoft.XMLHTTP")
连接服务器

oAjax.open(方法,url,是否异步)
我们都知道,Ajax即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。所以,Ajax天生就是工作在异步模式的(异步为true,同步false)

同步和异步

同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
(简单点说:同步就是只能一件一件事的来做,而异步就是可以多件事同时进行)

发送请求send()

<script type="text/javascript">

function getDoc(){

    var xmlhttp;

    if(window.xmlhttpRequest){

        xmlhttp=new XMLHttpRequest();

    }

    else{

        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");//for IE6

    }

    xmlhttp.onreadystatechange = function(){

        if(xmlhttp.readyState==4&&xmlhttp.status==200){

            document.getElementById("myId").innerHTML=xmlhttp.responseText;

        }

    }

    xmlhttp.open("GET", index.php,true);

    xmlhttp.send();

}

</script>

</head>

<body>

    <button type="button" onclick="getDoc()">请求数据</button>

</body>

GET 还是 POST?

与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。

然而,在以下情况中,请使用 POST 请求:

无法使用缓存文件(更新服务器上的文件或数据库)
向服务器发送大量数据(POST 没有数据量限制)
发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
接收返回信息

oAjax.onreadystatechange = function(){   //当请求状态改变时要调用的事件处理器

    alert(oAjax.readystate);          

}
只要readyState属性的值发生变化时,便会触发一次readyStatechange事件。可以利用这个事件来检测每次状态变化后readyState的值。通常,我们只对readyState值为4的阶段感兴趣,因为这时所有数据都已经就绪,不过,必须在调用open()之前指定onreadystatechange事件处理程序才能确保跨浏览器兼容性。下面来看一个例子:

var xhr = createXHR();

xhr.onreadystatechange = function () {

    if (xhr.readyState == 4) {

        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {

            alert(xhr.statusText);

        } else {

            alert("Request was unsuccessful: " + xhr.status);

        }

    }

};

xhr.open("get", "example.txt", true);

xhr.send(null);

XHR对象

当XHR对象把一个HTTP请求发送到服务器的过程中会经历几个状态,直到请求被处理,然后才接收一个回应。readyState就是XHR请求的状态属性,它本身有5个属性值:

0(未初始化)还没有调用open()方法
1(载入)已调用send()方法,正在发送请求
2(载入完成)send()方法完成,已收到全部响应内容
3(解析)正在解析响应内容
4(完成)响应内容解析完成,可以再客户端使用了
status

status属性表示从服务器返回的响应状态码。例如:200表示成功,404表示未找到。

1字头:消息。这一类型的状态码,代表请求已被接受,需要继续处理。
2字头:成功。这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
3字头:重定向。这类状态码代表需要客户端采取进一步的操作才能完成请求。
4字头:客户端错误。这类状态码代表了客户端看起来可能发生错误,妨碍了服务器的处理。
5字头:服务器错误。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生

另附:http状态码详解

statusText

statusText是响应返回的文本信息,仅当readyState值为3或4的时候才能使用。当readyState为其它值时视图存取statusText属性将引发异常。

XHR的方法

方法 描述
abort() 导致当前正在执行的请求被取消
getAllResponseHeaders() 返回包含所有响应头的名称和值的单个字符|串
getResponseHeader(name) 返回响应头中指定的名称和值
open(method,url,async,username,pwd) 设置HTTP方法(get或post)等
send(content) 发出带有指定主体内容的请求
setRequestHeader(name,value) 使用指定的名称和值设置请求头
<script type="text/javascript">

        var oAjax =oAjax();

        alert(oAjax.readyState);//弹出"0"

        oAjax.open("get","index.html",true);

        alert(oAjax.readyState);//弹出"1"

        oAjax.send(null);

        alert(oAjax.readyState);//IE下弹出4,而firefox是2

        //可以通过readystatechange事件监听

        oAjax = XHR();

        oAjax.onreadystatechange = function () {

            alert(oAjax.readyState);//Firefox下依次是1,2,3,4但最后还会再来个1

            //IE下则是1,1,3,4

        };

        oAjax.open("get","index.txt",true);

        oAjax.send(null);

</script>
Javascript 相关文章推荐
javascript里模拟sleep(两种实现方式)
Jan 25 Javascript
js实现的倒计时按钮实例
Jun 24 Javascript
JavaScript实现模仿桌面窗口的方法
Jul 18 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
Jul 14 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
May 02 Javascript
jQuery实现遍历XML节点和属性的方法示例
Apr 29 jQuery
bootstrap 路径导航 分页 进度条的实例代码
Aug 06 Javascript
JS实现头条新闻的经典轮播图效果示例
Jan 30 Javascript
详解JavaScript的变量
Apr 04 Javascript
vue读取本地的excel文件并显示在网页上方法示例
May 29 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
Sep 18 Javascript
解决vue-router 切换tab标签关闭时缓存问题
Jul 22 Javascript
javascript学习笔记(六)数据类型和JSON格式
Oct 08 #Javascript
javascript学习笔记(五)原型和原型链详解
Oct 08 #Javascript
JavaScript中获取高度和宽度函数总结
Oct 08 #Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
Oct 08 #Javascript
JavaScript中获取样式的原生方法小结
Oct 08 #Javascript
吐槽一下我所了解的Node.js
Oct 08 #Javascript
Node.js 的异步 IO 性能探讨
Oct 08 #Javascript
You might like
PHP5 安装方法
2006/10/09 PHP
用PHP和ACCESS写聊天室(二)
2006/10/09 PHP
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
用PHP代码给图片加水印
2015/07/01 PHP
php文件上传类的分享
2017/07/06 PHP
Javascript 类与静态类的实现
2010/04/01 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
python实战之实现excel读取、统计、写入的示例讲解
2018/05/02 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
python视频按帧截取图片工具
2019/07/23 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
Python3实现mysql连接和数据框的形成(实例代码)
2020/01/17 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
python实现猜单词游戏
2020/05/22 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
详解pandas赋值失败问题解决
2020/11/29 Python
在线学习西班牙语、法语或其他语言:Babbel.com
2018/02/07 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
干部培训自我鉴定
2014/01/22 职场文书
市级绿色学校申报材料
2014/08/25 职场文书
市委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
任命书格式范文
2015/09/22 职场文书