ajax 不重新加载整个网页的情况下,更新部分网页的技术

注意:ajax只有在服务器上运行才能生效,我在本地一般用phpstudy

优点:

1、优化用户体验

2、承担了一部分本该服务器端的工作,减轻了服务器端的压力

3、优化了服务器端和浏览器端的传输,减少了带宽占用

缺点:

1、不支持回退按钮

2、对搜索引擎的支持比较弱

3、安全问题,暴露了与服务器端交互的细节


XMLHttpRequest 对象

1、可以向服务器端发起请求并处理响应,而不阻塞用户

2、可以在不更新整个网页的的情况下,更新部分内容

如何使用ajax

1、创建XMLHttpRequest 对象

2、创建一个HTTP请求,并指定方式、URL(必填)

3、设置响应HTTP请求状态变化的函数

4、发起请求


创建XMLHttpRequest 对象的两种方式:(兼容各浏览器)

1、完整版

        //封装兼容各浏览器的xhr对象
function createXhr(){
//IE7+,其他浏览器
if(typeof XMLHttpRequest!="undefined"){
return new XMLHttpRequest();//返回xhr对象的实例
}else if(typeof ActiveXObject!="undefined"){
//IE7及以下
//所有可能出现的ActiveXObject版本
var arr=["Microsoft.XMLHTTP","MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP.2.0"];
var xhr;
//循环
for(var i=0,len=arr.length;i<len;i++){
try{
xhr=new ActiveXObject(arr[i]);//任意一个版本支持,即可退出循环
break;
}catch(e){ }
}
return xhr;//返回创建的ActiveXObject对象
}else{
//都不支持
throw new Error("您的浏览器不支持XHR对象!");
}
}

2、简略版

        function createXhr(){
//IE7+,其他浏览器
if(window.XMLHttpRequest){
return new XMLHttpRequest();
}else{
//IE7以下
return new ActiveXObject("Microsoft.XMLHTTP");
}
}

测试是否创建成功

        //创建XMLHttpRequest对象
var xhr=createXhr();
console.log(xhr);

 .open(method, url, async) 初始化请求并准备发送(只能对同一个域中使用相同端口和协议的URL发送请求)

method :get 或者 post( get 更快更简单,但不能发送大量数据,无法使用缓存文件,而且没有 post 稳定和可靠)

url :必填(文件在服务器上的位置,可以是任何类型,如.txt  .xml  .asp  .php)

async:是否异步,true 异步,false 同步(同步时,服务器处理完成之间浏览器必须等待;异步时,服务器未处理完成前,浏览器可以进行其他操作)

get 准备请求直接加上参数,post 准备请求不在此加参数

        //2、get创建请求
xhr.open("get","./server/slider.json?user=cyy&age=25",true);
//post创建请求
xhr.open("post","./server/slider.json",true);

响应XMLHttpRequest 对象状态变化的函数

.onreadystatechange  检测状态变化的函数

.readyState==4  响应内容解析完成

.status>=2==&&.status<300 异步调用成功

.status==304 请求资源没有被修改,可以使用浏览器的缓存


发送请求.send()

发送post请求需要传入参数(以对象形式),发送get请求不需要,可以传入null

post请求需要添加HTTP头

.setRequestHeader("Content-type", "application/x-www-form-urlencoded")

        //get发送请求
xhr.send(null); //post发送请求
xhr.send({user:"cyy",age:25});
//设置post请求头
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

获取到服务器返回的数据

responseText 服务器返回的数据的字符串形式

responseXML 服务器返回的数据的兼容DOM的文档数据对象(XML形式)

status 返回的状态码(如404表示没找到,200表示已就绪)

status Text 状态码的字符串信息

//获取服务器端返回的数据
console.log(xhr.responseText);

查看network状态

 json 数据格式

全称是javascript对象表示法,目的是为了取代笨重的XML格式

json 可以表示以下三种类型的值:

1、简单值

与js语法相同,可以是字符串、数值、布尔值、null,但不支持undefined

字符串必须用双引号表示,不能用单引号

数值必须是十进制,不能是 NaN 和 Infinity

2、对象

键名必须放在双引号中

同一个对象不应该出现两个同名属性

3、数组

数组或者对象最后一个成员,后面不能加逗号

示例:slider.json

{
"code": 0,
"slider": [
{
"linkUrl": "http://www.baidu.com",
"picUrl": "img/cat1.jpg"
},
{
"linkUrl": "http://www.baidu.com",
"picUrl": "img/cat2.jpg"
},
{
"linkUrl": "http://www.baidu.com",
"picUrl": "img/cat3.jpg"
},
{
"linkUrl": "http://www.baidu.com",
"picUrl": "img/cat4.jpg"
}
]
}

.responseText 返回的数据是字符串,因此需要先转为对象

使用.eval() 函数

//获取服务器端返回的数据
console.log(typeof xhr.responseText);//string
//把字符串转为对象
console.log(eval("("+xhr.responseText+")"));

eval("("+xhr.responseText+")"); 的意思是强制转化成json对象,之所以写成 eval“("("+data+")");这种格式,原因是由于json是以”{}”的方式来开始以及结束的。在JavaScript中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式,加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式转化为对象,而不是作为语句来执行,举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句,所以下面两个执行结果是不同的:

 console.log(eval("{}"));//undefined
console.log(eval("({})"));//{}

还有 json 对象的两个方法:

1、 JSON.parse()  用于将json字符串转为对象

2、JSON.stringify  将一个值转为JSON字符串

由于eval() 可以执行不符合json格式的代码,有可能会包含恶意代码,所以不推荐使用,建议还是使用.parse()

data=JSON.parse(xhr.responseText);
console.log(data.slider);

最后一步,渲染数据到页面中

放出文件index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo</title>
<style>
*{margin:0;padding:0;}
.wrap{width:250px;height:250px;margin:50px auto;overflow:hidden;}
.banner{height:250px;width:1000px;}
.banner a{width:250px;height:250px;display: block;float: left;}
.banner a img{width:250px;height:250px;display: block;}
</style>
<script src="jquery.js"></script> </head>
<body>
<div class="wrap">
<div class="banner" id="banner"></div>
</div>
<script>
//封装兼容各浏览器的xhr对象
function createXhr(){
//IE7+,其他浏览器
if(typeof XMLHttpRequest!="undefined"){
return new XMLHttpRequest();//返回xhr对象的实例
}else if(typeof ActiveXObject!="undefined"){
//IE7及以下
//所有可能出现的ActiveXObject版本
var arr=["Microsoft.XMLHTTP","MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP.2.0"];
var xhr;
//循环
for(var i=0,len=arr.length;i<len;i++){
try{
xhr=new ActiveXObject(arr[i]);//任意一个版本支持,即可退出循环
break;
}catch(e){ }
}
return xhr;//返回创建的ActiveXObject对象
}else{
//都不支持
throw new Error("您的浏览器不支持XHR对象!");
}
} //1、创建XMLHttpRequest对象
var xhr=createXhr(),data; //响应XMLHttpRequest状态变化的函数
//onreadystatechange监测状态变化
xhr.onreadystatechange=function(){
if(xhr.readyState==4){//响应内容解析完成
if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
//xhr.status>=200&&xhr.status<300 表示交易成功
//xhr.status==304 表示缓存后未发生改变,因此可以从缓存中读取
//获取服务器端返回的数据
//console.log(typeof xhr.responseText);//string
//把字符串转为对象
data=JSON.parse(xhr.responseText);
//console.log(data.slider);
//渲染数据
renderData(); }
}
}
//2、get创建请求
xhr.open("get","./server/slider.json?user=cyy&age=25",true);
//get发送请求
xhr.send(null); //post创建请求
//xhr.open("post","./server/slider.json",true);
//post发送请求
//xhr.send({user:"cyy",age:25});
//设置post请求头
//xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); //渲染数据
function renderData(){
var imgs=data.slider,str="";
var banner=document.getElementById("banner");
for(var i=0,len=imgs.length;i<len;i++){
//console.log(imgs[i]);
str+="<a href='"+imgs[i].linkUrl+"'><img src='"+imgs[i].picUrl+"'></a>";
}
console.log(str);
banner.innerHTML=str;
}
</script>
</body>
</html>

效果图(大概就是模拟获取轮播图)

 jquery的ajax方法:

$.ajax()

$.get()

$.post()

$.getJson()

        //jquery的$.ajax()
$.ajax({
url:"./server/slider.json", //请求地址
type:"post", //请求方式,默认是get
async:true, //异步同步,默认是true异步
dataType:"json", //返回的数据格式
success:function(data){ //响应成功的操作
JQRenderData(data.slider); //data是返回的数据
}
});
function JQRenderData(data){
var str="";
$.each(data,function(index,obj){
str+="<a href='"+obj.linkUrl+"'><img src='"+obj.picUrl+"'></a>";
});
$("#banner2").html(str);
}

$.each( obj, function(index, value){ } ) 方法,遍历对象或数组

index 数组索引或者对象属性名

value 数组项或者对象属性值

以下是用javascript 和 jqeury 两种方式实现的代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo</title>
<style>
*{margin:0;padding:0;}
.wrap{width:250px;height:250px;margin:50px auto;overflow:hidden;}
.banner{height:250px;width:1000px;}
.banner a{width:250px;height:250px;display: block;float: left;}
.banner a img{width:250px;height:250px;display: block;}
</style>
<script src="jquery.js"></script> </head>
<body>
<div class="wrap">
<div class="banner" id="banner"></div>
</div>
<div class="wrap">
<div class="banner" id="banner2"></div>
</div>
<script>
//封装兼容各浏览器的xhr对象
function createXhr(){
//IE7+,其他浏览器
if(typeof XMLHttpRequest!="undefined"){
return new XMLHttpRequest();//返回xhr对象的实例
}else if(typeof ActiveXObject!="undefined"){
//IE7及以下
//所有可能出现的ActiveXObject版本
var arr=["Microsoft.XMLHTTP","MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP.2.0"];
var xhr;
//循环
for(var i=0,len=arr.length;i<len;i++){
try{
xhr=new ActiveXObject(arr[i]);//任意一个版本支持,即可退出循环
break;
}catch(e){ }
}
return xhr;//返回创建的ActiveXObject对象
}else{
//都不支持
throw new Error("您的浏览器不支持XHR对象!");
}
} //1、创建XMLHttpRequest对象
var xhr=createXhr(),data; //响应XMLHttpRequest状态变化的函数
//onreadystatechange监测状态变化
xhr.onreadystatechange=function(){
if(xhr.readyState==4){//响应内容解析完成
if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
//xhr.status>=200&&xhr.status<300 表示交易成功
//xhr.status==304 表示缓存后未发生改变,因此可以从缓存中读取
//获取服务器端返回的数据
//console.log(typeof xhr.responseText);//string
//把字符串转为对象
data=JSON.parse(xhr.responseText);
//console.log(data.slider);
//渲染数据
renderData(); }
}
}
//2、get创建请求
xhr.open("get","./server/slider.json?user=cyy&age=25",true);
//get发送请求
xhr.send(null); //post创建请求
//xhr.open("post","./server/slider.json",true);
//post发送请求
//xhr.send({user:"cyy",age:25});
//设置post请求头
//xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); //渲染数据
function renderData(){
var imgs=data.slider,str="";
var banner=document.getElementById("banner");
for(var i=0,len=imgs.length;i<len;i++){
//console.log(imgs[i]);
str+="<a href='"+imgs[i].linkUrl+"'><img src='"+imgs[i].picUrl+"'></a>";
}
console.log(str);
banner.innerHTML=str;
}
</script>
<script>
//jquery的$.ajax()
$.ajax({
url:"./server/slider.json", //请求地址
type:"post", //请求方式,默认是get
async:true, //异步同步,默认是true异步
dataType:"json", //返回的数据格式
success:function(data){ //响应成功的操作
JQRenderData(data.slider); //data是返回的数据
}
});
function JQRenderData(data){
var str="";
$.each(data,function(index,obj){
str+="<a href='"+obj.linkUrl+"'><img src='"+obj.picUrl+"'></a>";
});
$("#banner2").html(str);
} </script>
</body>
</html>

 什么是跨域:

同源策略:域名、协议、端口都相同

不符合同源策略的请求,就是跨域

跨域常用的解决方式:JSONP

JSONP :JSON with padding (填充式json)

JSONP的原理:

直接用XMLHttpRequest 访问不同域上的数据是不可以的,但是可以在页面上引入不同域的 js 脚本(如 src 或者 href )

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo</title>
<script src="jquery.js"></script>
</head>
<body>
<script>
/*
封装JSONP
浏览器端给服务器端发送请求:
http://www.baidu.com?jsonp=abc
服务器端响应请求:
abc(json数据)
*/
function myJSONP(url,callback){
if(!url) return;//如果没有url,则停止
//用数组存储10个字母
var arr=["a","b","c","d","e","f","g","h","i","j"],
i1=Math.floor(Math.random()*arr.length),//随机生成索引
i2=Math.floor(Math.random()*arr.length),
i3=Math.floor(Math.random()*arr.length),
name="mydata"+arr[i1]+arr[i2]+arr[i3];//随机生成的请求函数名(属性名)
cbname="myJSONP."+name;//必须是函数名.请求函数名
//跨域url处理
//将请求函数名作为最后一个参数传递
if(url.indexOf("?")===-1){
//原来没有参数
url+="?jsonp="+cbname;//参数名可自定义(此处是jsonp)
}else{
//原来有参数
url+="&jsonp="+cbname;
}
console.log(url);
//动态创建script标签
var script=document.createElement("script");
//定义被脚本执行的回调函数
myJSONP[name]=function(data){
try{
callback && callback(data);//如果有回调,则执行回调
}catch(e){
//报错时
}finally{
//由于每次请求都会生成函数和script标签,长此以往会污染函数
//因此每次结束时都要删除函数及变量
delete myJSONP[name];
script.parentNode.removeChild(script);
}
} script.src=url;
document.getElementsByTagName("head")[0].appendChild(script);
} //发送跨域请求
myJSONP("http://class.imooc.com/api/jsonp",function(data){
console.log(data);
});
</script>
</body>
</html>

页面返回的数据

url演示

AJAX优势、跨域方案及JSON数据格式和浏览器中JSON对象的更多相关文章

  1. Ajax及跨域

    概念 Ajax Ajax,Asynchronous JavaScript and XML,字面意思:异步的 JavaScript 和 XML,是指一种创建交互式网页应用的网页开发技术. 用于异步地去获 ...

  2. jQuery的ajax jsonp跨域请求

    了解:ajax.json.jsonp.“跨域”的关系 要弄清楚以上ajax.json.jsonp概念的关系,我觉得弄清楚ajax是“干什么的”,“怎么实现的”,“有什么问题”,“如果解决存在的问题”等 ...

  3. jquery中ajax处理跨域的三大方式

    一.处理跨域的方式: 1.代理 2.XHR2 HTML5中提供的XMLHTTPREQUEST Level2(及XHR2)已经实现了跨域访问.但ie10以下不支持 只需要在服务端填上响应头: ? 1 2 ...

  4. ajax——CORS跨域调用REST API 的常见问题以及前后端的设置

    RESTful架构是目前比较流行的一种互联网软件架构,在此架构之下的浏览器前端和手机端能共用后端接口. 但是涉及到js跨域调用接口总是很头疼,下边就跟着chrome的报错信息一起来解决一下. 假设:前 ...

  5. JavaScript(10)——Ajax以及跨域处理

    Ajax以及跨域处理 哈哈哈,终于写到最后一章了.不过也还没有结束,说,不要为了学习而学习,恩.我是为了好好学习而学习呀.哈哈哈.正在尝试爱上代码,虽然有一丢丢的难,不过,我相信我会的! [Ajax] ...

  6. 前端总结·基础篇·JS(四)异步请求及跨域方案

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...

  7. 利用jquery的ajax实现跨域,内部其实是jsonp协议了,不是XHRhttp协议

    一.同源策略 要理解跨域,先要了解一下“同源策略”.所谓同源是指,域名,协议,端口相同.所谓“同源策略“,简单的说就是基于安全考虑,当前域不能访问其他域的东西. 一些常见的是否同源示例可参照下表: 在 ...

  8. ASP.NET MVC & WebApi 中实现Cors来让Ajax可以跨域访问 (转载)

    什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpReq ...

  9. Ajax的跨域请求——JSONP的使用

    一.什么叫跨域 域当然是别的服务器 (说白点就是去别服务器上取东西) 只要协议.域名.端口有任何一个不同,都被当作是不同的域. 总而言之,同源策略规定,浏览器的ajax只能访问跟它的HTML页面同源( ...

随机推荐

  1. Unity3d组件实现令人惊叹的像素粒子特效!

    我们先看看两个特效,感受一下,有没有学习的动力? =========================================================================== ...

  2. python + selenium定位页面元素的办法

    1.什么是Selenium,为什么web测试,大家都用它? Selenium设计初衷就是为web项目的验收测试再开发.内核使用的是javaScript语言编写,几乎支持所以能运行javaScript的 ...

  3. MVC 记录

    ASP.NET MVC框架提供了一个帮助我们构造Html元素的类:TagBuilder ps url cnblogs.com/yibinboy/articles/5187682.html HttpRu ...

  4. ios--->特定构造方法NS_DESIGNATED_INITIALIZER

    特定构造方法 1> 后面带有NS_DESIGNATED_INITIALIZER的方法,就是特定构造方法 2> 子类如果重写了父类的[特定构造方法],那么必须用super调用父类的[特定构造 ...

  5. PDO和Mysqli的区别

    参考:http://www.cnblogs.com/feng18/p/6523646.html 人家写的不错

  6. [Codeforces 1228E]Another Filling the Grid(组合数+容斥)

    题目链接 解题思路: 容斥一下好久可以得到式子 \(\sum_{i=0}^{n}\sum_{j=0}^{n}(-1)^{i+j}C_n^iC_n^j(k-1)^{ni+nj-ij}k^{n^2-(ni ...

  7. ArrayAccess 接口(源码)

    The ArrayAccess interface (PHP 5 >= 5.0.0, PHP 7) Introduction Interface to provide accessing obj ...

  8. Flink安装及实例教程

    通过本教程我们将快速部署好flink在linux下的环境,并通过flink完成一个小demo的测试 一.准备阶段 flink压缩包下载(1.7.2): http://archive.apache.or ...

  9. Linux内核单链表

    主要说明Linux内核中单链表操作的关键思想,需要注意的地方 1. 假设 为了说明关键思想,对数据结构进行了精简 2. 数据结构定义 struct ListNode { int val; ListNo ...

  10. HDU_1506_单调栈

    http://acm.hdu.edu.cn/showproblem.php?pid=1506 从栈底到栈顶从小到大排序,碰到比栈定小的元素,出栈处理,直到栈顶比元素小或者栈为空. 数组最后多加了个-1 ...