原生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,是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数 ...
随机推荐
- Java 数组扩容
在添加数据到达数组的上限的时候数组进行扩容: public void resizeArrayCaptcity(){ if(size>=arr.length){ Emp [] arr2=new ...
- 用css绘制各种图形
1.用css绘制三角形 http://www.cnblogs.com/blosaa/p/3823695.html
- 【DP】捡苹果
#include<stdio.h> int max(int a,int b) { int c; if(a>b) c=a; else c=b; return c; } int main ...
- zoj1002 Fire Net
Fire Net Time Limit: 2 Seconds Memory Limit: 65536 KB Suppose that we have a square city with s ...
- 云计算---openstack各服务端口使用情况
端口占用情况 端口情况可以使用ss -tanp命令进行查看 监听的所有端口ss -tanp | grep LISTEN 基础服务 22 --SSH 3306 --MariaDB(MySQL) 2701 ...
- plsql经验之谈
工具你用熟悉了,可以解决实际生活得问题,且是快速的.比如我们要需要表的字段,和注释的时候,直接右击,详情,可以复制. 我们讲个熟悉的场景或者案例,比如,我们需要把已经建立的源表,需要一定的加工和处理, ...
- phpstudy升级mysql数据库
因为MySQL支持全文索引的只有5.6以上,而我下的phpstudy只有5.5的版本,在导入数据库的时候因为该数据库的表内有使用全文索引,因此必须升级phpstudy的mysql版本,这里就把自己当升 ...
- android 屏幕适配基础(1)
1. 概念定义 寸/英寸: 1寸=3.333333厘米:1英寸=2.54厘米(屏幕尺寸以英寸为单位) 像素 : 像素是组成图象的最基本单元要素:点. 一个像素有多大呢?主要取决于显示器的分辨 ...
- ASP.NET没有魔法——ASP.NET MVC IoC
之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...
- 解决由于VNC日志导致服务器磁盘100%
今天通过SSH连接服务器看到磁盘直接100%了.于是通过 sudo du -h --max-depth=1 发现某个用户下面占用了100个G.于是切换进去看了一下.发现VNC的log占满了整个磁盘.然 ...