视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001 知道1 知道21 知道41 知道61 知道81 知道101 知道121 知道141 知道161 知道181 知道201 知道221 知道241 知道261 知道281
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
原生js的ajax和解决跨域的jsonp(实例讲解)
2020-11-27 22:27:51 责编:小采
文档

最近慢慢感觉,学再多框架,库,都不如老老实实先把基础弄扎实了。

不说废话,先上一个用ajax请求下本地的一个.txt文件

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <script>
 window.onload =function(){
 var oBtn = document.getElementById('btn');

 oBtn.onclick = function(){
 //创建XHR对象
 var xhr = new XMLHttpRequest();

 //请求的方式,地址,是否异步
 xhr.open('get','test.txt',true);

 //请求的确定操作,初始化,相当于搜索时,敲击的回车
 xhr.send(null);

 //请求的readyState每变化一次就执行一次onreadystatechange函数
 //其中readyState表示的是:请求/响应过程的当前活动阶段
 //readyState有如下取值
 /*
 * 0:未初始化,尚未调用send()方法
 * 1: 启动
 * 2:发送
 * 3:接收
 * 4:完成
 */
 xhr.onreadystatechange =function(){
 if(xhr.readyState ==4){
 alert(xhr.responseText);
 }
 }
 };


 };
 </script>
</head>
<body>
<input type="button" id="btn" value="show">
</body>
</html>

执行效果如下,点击show就会通过ajax请求本地的.txt文件。

代码比较简单,加上注释,相信很容易就看得懂。

但是工作中我们经常会请求其他域下的资源(因为同源策略),这个时候就遇到了跨域(协议,端口,域名任何一个不同就算是跨域)。

解决跨域的一种常用办法就是jsonp,虽然他有局限性(只支持get请求),不过优点是兼容老式浏览器(不过现在好像很少有人在意老式浏览器了)。

jsonp的基本原理:就是通过动态创建script标签,script标签的src是没有跨域限制的。

接下来上一个类似百度搜索下拉的页面

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <style>
 *{
 margin: 0;
 padding: 0;
 }
 input{
 width:300px;
 height:30px;
 border:1px solid lightgray;
 margin-top: 150px;
 margin-left: 200px;
 padding-left: 5px;
 }
 ul{
 width:307px;
 list-style: none;
 margin-left: 200px;
 display: none;
 }
 li{
 height:30px;
 border: 1px solid lightgray;
 line-height: 30px;
 padding-left: 5px;
 }
 </style>
 <script>
 function callbackD(response){
 var oUl = document.getElementById('ulList');
 var html='';
 if(response.s.length !=0){
 oUl.style.display='block';
 for(var i = 0;i<response.s.length;i++){
 html+='<li>'+response.s[i]+'</li>'
 }
 }
 oUl.innerHTML = html;
 }
 </script>
 <script>
 window.onload = function(){
 //获取dom元素
 var oData = document.getElementById('inputSearch');
 var oUl = document.getElementById('ulList');

 //键盘按下后抬起触发事件(onkeyup)
 oData.onkeyup = function(){
 if(oData.value != ''){
 //创建标签(createElement)
 var script = document.createElement("script");
 //添加地址
 script.src='http://unionsug.baidu.com/su?wd='+this.value+'&p=3&cb=callbackD';
 //添加给body的(成为body包涵的孩子)
 document.body.appendChild(script);
 }else{
 oUl.style.display='none';
 }

 }

 };
 </script>
</head>
<body>
<input type="text" id="inputSearch">
<ul id="ulList">
 <li>123</li>
</ul>
</body>
</html>

执行效果如下:

代码也相对比较简单,加上代码的注释,一定很容易看懂,这就是解决跨域的一种常用办法,其他有反向代理,CORS啊等等,等我学好再整理出来。

以上这篇原生js的ajax和解决跨域的jsonp(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

下载本文
显示全文
专题