原生JS实现Ajax及Ajax的跨域请求
前 言
如今,从事前端方面的程序猿们,如果,不懂一些前后台的数据交互方面的知识的话,估计都不太好意思说自己是程序猿。当然,如今有着许多的框架,都有相对应的前后台数据交互的方法。
而,其中,用得最多的应该苏算是JQuery的Ajax了。但是,今天,影子向大家介绍的是原生js的Ajax,及跨域请求。
| 一、 JQuery的Ajax |
首先,先回忆下JQuery的Ajax写法:
$.ajax({
url: ,
type: '',
dataType: '',
data: {
},
success: function(){
},
error: function(){
}
})
| 二、原生JS实现Ajax |
// 第一步: 获得XMLHttpRequest对象
var ajax = new XMLHttpRequest();
// 第二步: 设置状态监听函数
ajax.onreadystatechange = function(){
console.log(ajax.readyState);
console.log(ajax.status);
// 第五步:在监听函数中,判断readyState=4 && status=200表示请求成功
if(ajax.readyState==4 && ajax.status==200){
// 第六步: 使用responseText、responseXML接受响应数据,并使用原生JS操作DOM进行显示
console.log(ajax.responseText);
console.log(ajax.responseXML);// 返回不是XML,显示null
console.log(JSON.parse(ajax.responseText));
console.log(eval("("+ajax.responseText+")"));
}
}
// 第三步: open一个链接
ajax.open("GET","h51701.json",false);//true异步请求,false同步 // 第四步: send一个请求。 可以发送对象和字符串,不需要传递数据发送null
ajax.send(null);
注释:
1. open(method, url, async) 方法需要三个参数:
method:发送请求所使用的方法(GET或POST);与POST相比,GET更简单也更快,并且在大部分情况下都能用;然而,在以下情况中,请使用POST请求:
- 无法使用缓存文件(更新服务器上的文件或数据库)
- 向服务器发送大量数据(POST 没有数据量限制)
- 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
url:规定服务器端脚本的 URL(该文件可以是任何类型的文件,比如 .txt 和 .xml,或者服务器脚本文件,比如 .asp 和 .php (在传回响应之前,能够在服务器上执行任务));
async:规定应当对请求进行异步(true)或同步(false)处理;true是在等待服务器响应时执行其他脚本,当响应就绪后对响应进行处理;false是等待服务器响应再执行。
2. send() 方法可将请求送往服务器。
3. onreadystatechange:存有处理服务器响应的函数,每当 readyState 改变时,onreadystatechange 函数就会被执行。
4. readyState:存有服务器响应的状态信息。
- 0: 请求未初始化
- 1: 服务器连接已建立
- 2: 请求已接收
- 3: 请求处理中
- 4: 请求已完成,且响应已就绪
5. responseText:获得字符串形式的响应数据。
eval() 和JSON.parse()
另外,给大家介绍两种解析字符串的方法:
eval() :
eval函数用于将字符串中的JS代码解析出来并执行!!
当使用eval函数解析JSON字符串时,需 要在函数内部将JSON字符串用()拼接
例如: eval("("+json1+")")
表示eval函数中的字符串不是用于执行,而是要进行字符串解析
即:
eval("("+json1+")") = JSON.parse(json1;
JOSN.parse() :
纯粹的将JSON字符串解析为数组或对象;
| 四、 Ajax的跨域请求 |
首先,我们得知道 为什么会有跨域请求这回事,以及什么情况下会有跨域请求?
1 同源策略
同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。
它的定义是:
一段脚本向后台请求数据,只能读取属于同一协议名、同一主机名、同一端口号下的数据;
所以,请求不同协议名、不同端口号、不同主机名下面的文件时,
将会违背同源策略,无法请求成功,需要进行跨越处理!!
2解决跨域请求的方法
前台无需任何设置,在后台被请求的PHP文件中,写入一条header。
header("Access-Control-Allow-Origin:*");
--- 表示允许哪些域名请求这个PHP文件,*表示所有域名都允许
JS代码:

注释:
其中,url为PHP文件的路径;
PHP代码:

结果:

实现步骤:
1、原有src属性的标签子带跨域功能;所以可以使用script标签的src属性请求后台数据
<script src="http://127.0.0.1/json.php">< /script>
2、用于src在加载数据成功后,会直接将加载的内容放到script标签中;
所以,后台直接返回JSON字符串将不能在script标签中解析。
因此,后台应该返回给前台一个回调函数名,并将JSON字符串作为参数传入。
后台PHP文件中返回: echo "callback({$json})";
3、前台接收到返回的回调函数,将直接在script标签中调用。因此,需要声明这样一个回调函数,作为请求成功的回调
function callback(data){
alert("请求成功!!");
console.log(data);
}
JS代码:

PHP文件:
结果:

1、在ajax请求时,设置dataType为"jsonp";
2、后台返回时,依然需要返回回调函数名,但是,ajax在发送请求时,会默认使用get请求将回调函数名发给后台,
后台$_GET['callback'] 取出函数名:
--- echo "{$_GET['callback']}({$str})";
3、后台返回以后,前台就可以使用ajax的success函数作为成功的回调
--- success : function(data){}
js代码:

PHP文件:

结果:

当然,后台也可以随便返回一个函数名,前台只要请求成功,就会自动调用这个函数。类似第二条的②、③步,而不需要本方法的第③步
PHP返回: echo "callback({$str})";
JS代码: function callback(data){
console.log(data);
}
js代码:

PHP文件:

结果:

虽然,影子是一名web前端工程师,但是,影子中的觉得关于数据交互这一块,对我们这一群人来说,要用的地方还是,比较多的;况且,就算是用不到,多一技傍身也是,不错的;
好了,今天,影子的分享,就到这里结束了,感谢大家的支持!!!!
原生JS实现Ajax及Ajax的跨域请求的更多相关文章
- Springboot如何优雅的解决ajax+自定义headers的跨域请求
1.什么是跨域 由于浏览器同源策略(同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.),凡是发 ...
- Springboot如何优雅的解决ajax+自定义headers的跨域请求[转]
1.什么是跨域 由于浏览器同源策略(同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.),凡是发 ...
- Ajax+Spring MVC实现跨域请求(JSONP)JSONP 跨域
JSONP原理及实现 接下来,来实际模拟一个跨域请求的解决方案.后端为Spring MVC架构的,前端则通过Ajax进行跨域访问. 1.首先客户端需要注册一个callback(服务端通过该callba ...
- Ajax+Spring MVC实现跨域请求(JSONP)(转)
背景: AJAX向后台(springmvc)发送请求,报错:已阻止交叉源请求:同源策略不允许读取 http://127.0.0.1:8080/DevInfoWeb/getJsonp 上的远程资源.可 ...
- Ajax+Spring MVC实现跨域请求(JSONP)
背景: AJAX向后台(springmvc)发送请求,报错:已阻止交叉源请求:同源策略不允许读取 http://127.0.0.1:8080/DevInfoWeb/getJsonp 上的远程资源.可 ...
- Ajax 调用webservice 解决跨域请求和发布到服务器后本地调用成功外网失败的问题
webservice 代码 /// <summary> /// MESService 的摘要说明 /// </summary> [WebService(Namespac ...
- Ajax操作如何实现跨域请求 (JSONP和CORS实现Ajax跨域的原理)
由于浏览器存在同源策略机制,同源策略阻止ajax (XMLHttpRequest) 从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响 ...
- jQuery Ajax 简单的实现跨域请求
html 代码清单: <script type="text/javascript" src="http://www.youxiaju.com/js/jquery-1 ...
- ajax发送多个跨域请求回调不混乱
var count = 0; var codes = ""; function refreshCache(urls){ try { var url = urls.split(&qu ...
- AJAX请求和跨域请求详解(原生JS、Jquery)
一.概述 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = 异步 JavaScript 和 XML,是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数 ...
随机推荐
- Unity GameObject Class
GameObject Note : gameObject 指的是当前挂着的对象. class in UnityEngine / Inherits from:Object Descriptio ...
- 参加Java培训你必须知道的五点真相!
相信大家都有过到招聘网站投简历.找工作的经历.当一份份简历发出三天后,左等右等连一个电话没有等来,心中不免有些失落,有些焦虑.这个时侯,很多培训机构就会纷纷给你打电话以各种名义让你参加各种IT技能培训 ...
- 【京东账户】——Mysql/PHP/Ajax爬坑之用户登录
一.引言 实现京东的账户项目,功能模块之一,用户登录.要用到的是Apach环境,Mysql.PHP以及Ajax. 二.依据功能创建库.表.记录 创建库:jd 创建表:登录表 添加三条记录 CREATE ...
- java 基础语法 1
一.标识符 二.关键字 三.JAVA基础数据类型 3.1. java常量 3.2. java变量 从本质上来讲,变量其实是内存里面的一小块区域,一个程序在运行的时候,实际上这个程序是位于内存里面,然后 ...
- javaWeb正则表达式
对于web来说,字符串的处理特别重要,而正则表达式是对字符串处理的利器,在字符过滤,验证方面都能看到她的身影. 今天需要处理一段json字符串,在用String.replaceAll的过程中,遇到了正 ...
- 19.Linux-USB总线驱动分析
如下图所示,以windows为例,我们插上一个没有USB设备驱动的USB,就会提示你安装驱动程序 为什么一插上就有会提示信息? 是因为windows自带了USB总线驱动程序, USB总线驱动程序负责: ...
- Windows中的硬链接和软链接(hard link 和 Symbolic link)
先来了解一下Linux中的硬链接和软链接: Linux中的硬链接和软链接 Windows中的硬链接和软链接: 硬链接 从Windows NT4开始,NTFS文件系统引入了HardLink这个概念,它让 ...
- Windows下MySQL5.6.21安装步骤
01.把 mysql-advanced-5.6.17-winx64.zip 解压到自定义 D:\mysql-5.6.17-W64 或 D:\mysql-advanced-5.6.17-winx64 目 ...
- 在前端页面对easyui中的datagrid与jqgrid加载后的数据进行操作
因为项目的需求,需要在grid中加载数据后再在前端页面执行操作,所以在easyui中的grid与jqgrid都进行了测试和操作: eayui中grid数据的操作: //构造集合对象 var list ...
- 平稳切换nginx版本
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...