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. LeetCode 858 镜面反射

    题目 有一个特殊的正方形房间,每面墙上都有一面镜子.除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2. 正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接 ...

  2. 博客与微信小程序的同步

    在此之前,先说说自己最近的打算,才购买了阿里云的服务器,想做一个网站和图床网盘之类的方便自己使用. 考虑到小程序,又打算将自己的博客内容放到小程序中.从零开发实属困难,应该还要一段时间才能完成. 目前 ...

  3. Educational Codeforces Round 81 (Rated for Div. 2) B. Infinite Prefixes

    题目链接:http://codeforces.com/contest/1295/problem/B 题目:给定由0,1组成的字符串s,长度为n,定义t = sssssss.....一个无限长的字符串. ...

  4. 龙芯 3A4000 Fedora28 安装笔记

    版权声明:原创文章,未经博主允许不得转载 3A4000用起来性能显然已经非常优秀,和朋友手上的3A3000相比有很大的提升(果然网上水分超多的什么测评看看呵呵就好).从零开始却用一半的核数和更低的制程 ...

  5. xpath写法汇总(适用于appium、robotframework)

    1.移动端应用,content-des包含“订单号” xpath=//android.view.View[contains(@content-desc,"订单号:")] 2.移动端 ...

  6. Windows PHP 开启opcache的方法

    PHP opcache可以提升性能.Windows PHP 配置 opcache 的方法如下: 1.先检查PHP目录下ext目录中有没有php_opcache.dll,没有的话自己下载(PHP 5.5 ...

  7. CORS解决跨域问题的几种方法

    一 后端服务器使用过滤器 新建过滤器: /** * 解决跨域 */ public class AccessControlAllowOriginFilter implements Filter { @O ...

  8. centos7 手动设置时间

    date -s "2020-02-03 23:13:00" hwclock -w clock -w

  9. react中,路由的使用。import {BrowserRouter,Switch,Route} from "react-router-dom";

      import React from "react"; import ReactDom  from "react-dom"; import {BrowserR ...

  10. 3万字总结,Mysql优化之精髓

    本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降. ...