利用jsonp解决js读取本地json跨域的问题


Posted in Javascript onDecember 11, 2018

前言

本文主要给大家介绍了关于使用jsonp解决js读取本地json跨域的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

一 、问题描述

通过ajax方式读取本地json文件,谷歌浏览器会提示跨域错误,导致获取不到json数据。

跨域报错.png

ajax获取json数据代码:

$.ajax({
   url: "file/employeejson.json",//json文件位置
   type: "GET",//请求方式为get
   dataType: "json", //返回数据格式为json
   success: function(data) {//请求成功完成后要执行的方法 
   console.log(data); 
   }
  })

这段代码本身没有错误,只是谷歌浏览器因为安全问题,拦截这类的访问。但是在火狐浏览器中可以访问,可以去尝试一下。

二、解决跨域问题

使用jsonp解决跨域 :(仅适用于GET请求)

实现原理:

<script> 标签是不受同源策略的限制的,它可以载入任意地方的 JavaScript 文件,而并不要求同源。

所以 JSONP 的理念就是,我和服务端约定好一个函数名,当我请求文件的时候,服务端返回一段 JavaScript。这段 JavaScript 调用了我们约定好的函数,并且将数据当做参数传入。非常巧合的一点(其实并不是),JSON 的数据格式和 JavaScript 语言里对象的格式正好相同。所以在我们约定的函数里面可以直接使用这个对象。

直接上代码:

<!DOCTYPE html> 
<html> 
 <head> 
  <meta charset="UTF-8"> 
  <title>JSON文件的调用</title> 
  <script type="text/javascript" src="jquery-1.11.2.min.js"></script>  
 </head> 
 <body> 
 </body> 
 <script>
    //回调函数
  function train (data){ 
     console.log(data);
  } 
</script>

<!--jsonp中 需要注意的是 
 <script src="file/employeejson.json?cb=train"></script> 
 src ? 之前为文件地址,? 之后为回调函数callback名称, 
回调函数可以简写为 cb , 然后 回调函数 名称要与JSON文件中的名称一致 
可以在 对应的文件名中看下,如,employeejson.json?callback=train,employeejson.json的 函数名为 train--> 
<script src="file/employeejson.json?cb=train"></script>
</html> 
 //JSON文件 
train(
 [
 {
  "name":"xx",
  "id":"ww"
  }
 ]
 )

三、注意

  • 一定要在json文件的外部用函数名+()套住;
  • js中的回调函数一定要与json中函数名相同;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript的面向对象(二)
Nov 09 Javascript
jQuery布局插件UI Layout简介及使用方法
Apr 03 Javascript
从jquery的过滤器.filter()方法想到的
Sep 29 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
Mar 19 Javascript
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
ES6学习笔记之Set和Map数据结构详解
Apr 07 Javascript
Vue组件Draggable实现拖拽功能
Dec 01 Javascript
JS实现盒子拖拽效果
Feb 06 Javascript
JS如何生成随机验证码
Mar 02 Javascript
Vue+tracking.js 实现前端人脸检测功能
Apr 16 Javascript
Openlayers实现测量功能
Sep 25 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
Jan 06 Javascript
实现Vue的markdown文档可以在线运行的方法示例
Dec 11 #Javascript
JS中使用new Option()实现时间联动效果
Dec 10 #Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
Dec 10 #Javascript
移动端如何用下拉刷新的方式实现上拉加载
Dec 10 #Javascript
vue+Element-ui实现分页效果实例代码详解
Dec 10 #Javascript
JQuery实现ajax请求的示例和注意事项
Dec 10 #jQuery
微信小程序实现动态获取元素宽高的方法分析
Dec 10 #Javascript
You might like
ubuntu12.04使用c编写php扩展模块教程分享
2013/12/25 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
php简单获取目录列表的方法
2015/03/24 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
JS类的封装及实现代码
2009/12/02 Javascript
浅析Prototype的模板类 Template
2011/12/07 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
nodejs检测因特网是否断开的解决方案
2019/04/17 NodeJs
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python实现中文转换url编码的方法
2016/06/14 Python
python使用super()出现错误解决办法
2017/08/14 Python
python list元素为tuple时的排序方法
2018/04/18 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
pandas 将索引值相加的方法
2018/11/15 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
Matplotlib绘制雷达图和三维图的示例代码
2020/01/07 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
Python eval函数原理及用法解析
2020/11/14 Python
Python脚本调试工具安装过程
2021/01/11 Python
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
小区门卫管理制度
2014/01/29 职场文书
党建工作经验交流材料
2014/05/25 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
纪检监察立案决定书
2015/06/24 职场文书
高中物理教学反思
2016/02/19 职场文书