1.Ajax概述

Asynchronous JavaScript + XML,支持js与服务器通信。在不unload页面的前提下从服务器获取新数据,以实现更好的用户体验(与传统的单击-等待交互不同的体验)。

IE5最先提供了支持,在MSXML库中新增了XHR对象(XMLHttpRequest),可以通过new ActiveXObject(str)的方式创建XHR对象,虽然不是很方便,但至少是原生支持

2.XHR对象

XMLHttpRequest,[IE6-]对XHR对象的实现与其它浏览器不同,但可以通过对象检测来创建跨浏览器的XHR对象,具体代码如下:

/*获取HttpRequest对象,可以兼容各个浏览器 包括IE5.5+*/
function getHttpObject(){
if(typeof XMLHttpRequest == "undefined"){//如果该对象未定义,则自定义该对象
XMLHttpRequest = function(){
try{
return new ActiveXObject("Msxml2.XMLHTTP.6.0");
}catch(e){}
try{
return new ActiveXObject("Msxml2.XMLHTTP.3.0");
}catch(e){}
try{
return new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){}
try{//老版本的 Internet Explorer (IE5 和 IE6)
return new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){} return false;
}
} return new XMLHttpRequest();
}

XHR对象的属性如下:

  • responseText:响应体

  • responseXML:如果响应内容是”text/xml”或者”application/xml”,这个属性会保存响应数据的XML DOM文档

  • status:响应的HTTP状态(404, 200之类的)

  • statusText:HTTP状态说明,不可靠,因为各个浏览器不一样,直接用status状态码最可靠

  • readyState:多用于异步请求,虽然同步请求也能用,但没什么意义,readyState的5个值如下:

    • 0:未初始化。还没调用open方法

    • 1:启动。调用了open没调用send

    • 2:发送。调用了send还没收到响应

    • 3:接收。拿到了部分响应数据

    • 4:完成。拿到了所有数据,并且数据已经可用了

3.用XHR对象实现执行回调函数

var xhr = getHttpObject();
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304){//本来只用检测200成功和304不变但有些浏览器会把200错报成204
//执行callback
}
else{
//请求失败
}
}
}

注意:必须在open函数之前设置readystatechange事件处理器,以保证全浏览器兼容

4.用XHR对象实现get/post请求

//get请求
xhr.open('get', url, false/true);//初始化,false/true ~ 同步/异步
xhr.send(null);//发送请求,null是为了兼容性
//post请求
xhr.open('post', url, false/true);//同上
xhr.send(str);
/* 可以在open后send前设置请求头,比如添加cookie信息
xhr.setRequestHeader(strHeader, strValue);
*/

注意:服务器对post请求和提交web表单的请求处理方式不一致,但可以通过修改HTTP头来模拟表单提交

但如果要发送表单数据的话,send的参数str必须是经过序列化的表单数据。此时需要模拟实现序列化函数,比较麻烦,JQuery提供了序列化支持,可以直接$(‘#mForm’).serialize()序列化表单

5.终止请求

xhr.abort();可以在响应返回前终止请求,abort之后不会再触发事件,不允许再访问xhr的响应相关属性

注意:终止请求后应该解除XHR对象的引用,不建议重用XHR对象(由于内存原因)

6.用post还是用get?

post请求消耗的资源多,数据传输速率也比get请求慢很多

但get请求不安全,而且IE对URI的长度有限制(不超过2048个字节),所以尽量用get,不行再用post

7.CORS概述

Cross-Origin Resource Sharing,跨源资源共享,Ajax受同源策略限制,通过一些CORS技术可以打破同源策略限制。例如IE8的XDR对象

其它浏览器通过增强XHR对象实现了对CORS的原生支持:把open函数的url参数设置为绝对URL就好了

所以为了消除歧义,应该在访问本地资源时用相对URL,访问远程资源时用绝对URL

8.其它跨域技术

  1. 图像Ping

    var img = new Image();
    img.onload = img.onerror = function(){
    //响应返回,执行回调函数
    }
    img.src = url;//一旦设置了src属性,就会立即请求(加载)图片,而不是把img元素插入DOM树后才开始

    只能发送get请求,且无法访服务器的响应文本,多用于跟踪用户点击页面或动态广告曝光次数

  2. JSONP

JSON with Padding,支持浏览器与服务器进行双向通信,且能够直接访问响应文本,但需要服务器端代码的配合,不易确定请求失败与否,而且从其它域加载代码执行,会存在安全问题

有一篇很不错的介绍跨域技术的博文

9.CSRF攻击

Cross-Site Request Forgery,跨站请求伪造,向页面直接插入Ajax代码,不存在同源策略限制,从而伪造请求访问敏感数据。

防范方法有:

  1. 要求用SSL连接访问资源

  2. 要求每次请求必须附带上特殊算法计算得到的验证码

JS学习笔记10_Ajax的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

  3. JS 学习笔记--9---变量-作用域-内存相关

    JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...

  4. WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)

    WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...

  5. WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法

    WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...

  6. WebGL three.js学习笔记 创建three.js代码的基本框架

    WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...

  7. vue.js 学习笔记3——TypeScript

    目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...

  8. 2019-4-29 js学习笔记

    js学习笔记一:js数据类型   1:基本数据类型       number类型(整数,小数)      String类型          boolean类型        NaN类型其实是一个nu ...

  9. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

随机推荐

  1. Python自动化 【第九篇】:Python基础-线程、进程及python GIL全局解释器锁

    本节内容: 进程与线程区别 线程 a)  语法 b)  join c)  线程锁之Lock\Rlock\信号量 d)  将线程变为守护进程 e)  Event事件 f)   queue队列 g)  生 ...

  2. TJI读书笔记09-访问控制权限

    TJI读书笔记09-访问控制权限 包,package和import 权限修饰符 接口和实现 类的访问权限控制 首先问一个问题,为什么要有访问控制权限? 安全,这当然是一个很重要的原因. 让类库的使用者 ...

  3. 博客的开端,找对象不再new

    今天是第一次用blog,小白开始完善了!! 希望大家多多照顾一下.

  4. Java NIO教程 前言

    阅读本文前,建议你先了解 旧I/O NIO 是 New I/O 的缩写,要了解它真正的内涵,需要掌握的知识还是比较多的.我努力在这几篇笔记里,勾勒出整个io的面貌.为大家的深入学习铺路. I/O简史 ...

  5. sqlserver巧用row_number和partition by分组取top数据

    SELECT * FROM( SELECT orderid,createtime, ROW_NUMBER() over(PARTITION by orderid order by createtime ...

  6. B. Santa Claus and Keyboard Check 模拟

    http://codeforces.com/contest/752/problem/B uuu yyu xy xx 注意变化了之后,检查一次前面已经变化过的就好.因为可能前面的满足,但是变了后不满足. ...

  7. zzulioj 1907小火山的宝藏交易(dfs记忆化搜索)

    #include <stdio.h> #include <algorithm> #include <string.h> #include <vector> ...

  8. URLEncoder编码

    客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文. 而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址, 将网址中的非ASCII码内容转换成可以 ...

  9. Daily Scrum 12.1

    今日完成任务: 完成了对源代码结构的修改,删除冗余等:和其他小组讨论了关于整合的问题,向其他小组介绍自己小组使用的数据库等. 明日任务: 晏旭瑞 初步完成文档上传下载 孙思权 深入了解数据库中每个表, ...

  10. [VS2013]如何闪开安装VS2013必须要有安装IE10的限制

    来源:http://blog.163.com/qimo601@126/blog/static/1582209320143354446462/   已阻止安装程序,此版本的Visual Studio需要 ...