由浅入深学习ajax跨域(JSONP)问题
什么是跨域?说直白点就是获取别人网站上的内容。但这么说貌似又有点混淆,因为通常我们用ajax+php就可以获取别人网站的内容,来看下面这个例子。
来看看跨域的例子,jquery+ajax是不能跨域请求的,因为受到浏览器的同源策略的限制,会报错。
错误:
但是script标签的src是具有跨域能力的,还有img的src属性一样,都能够获取从别人网站的内容。在没说道JSONP之前,我们可以用静态的script标签加上src去获取:
这里的a.js
结果:
在这里说明,a.js是在本地服务器里的,而测试文件并不在本地服务器中,也就是说他们的域是不同的。这段代码也相当于把跨域了的js文件加载到测试中间中了,相当于调用了这个函数。
而JSONP的原理也是类似的,只不过采用的是动态创建script标签:
将静态的替换为了动态的而已。这就是jsonp的原理了吧,我是这么认为的。原生的使用起来总是这么麻烦。
那么将其结合jquery来使用会是怎样?
这里的jsonpCallback是用来指定回调方法,这里我为什么填了一个aaa呢?因为是我随便填的,在这里并没有多大意义,因为我并没有定义aaa函数,所以,当我没有定义aaa函数的时候,jquery会自动匹配函数success:function(json){ }。但如果我定义了aaa呢?如图:
显示的结果没变,还是
因为涉及跨域的问题还有一个jquery方法可以实现,那就是$.getJSON,只不过不能指定回调函数,在这里就不演示了,用法都是一样的,来张图:
有的同学能会遇到这样的问题,就是返回的状态码已经是200了,并且也能看到返回的数据,但浏览器会报错,并且$.ajax执行的回调函数是error,并不是success
那是因为没有理解JSONP的运行原理,它的原理是把远程的数据当作javascript来运行的,到这里就很有必要说一下远程的php代码了,报错的同学的php代码可能是这样的,返回json格式数据
但你发现没有,在ajax请求的时候,我们发送给服务器一个回调函数的名字,默认都是callback,就是这句: jsonp: "callback",有的同学刚开始肯定没理解,再看看正确的php代码:
我们默认就将callback函数发送过去了,并返回了形如 函数名(json数据),这也就是我们前端说的JSONP的原理所在,是以js代码运行的,就相当于把这个函数加载到文件中调用了这个回调函数,对吧?慢慢理解。
再来说说区别,ajax和jsonp,有人说(我之前也这么认为),ajax可以通过请求本地的php,用php去抓取别人网站的数据,再显示,那算不算跨域呢?我觉得算是,对此我也不很清楚,若有大侠见此,能否为我指点迷经。但是jsonp是直接请求跨域的php文件而不是本地,但说到底,ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加script标签来调用服务器提供的js脚本。
或许,也可以这样说,ajax与jsonp的区别不在于是否跨域,ajax通过服务端代理一样可以实现跨域,jsonp本身也不排斥同域的数据的获取。
我似乎还是没有理解透彻,希望大侠到此指点指点。致敬。
参考:
jsonp跨域请求学习笔记
【原创】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
使用 JSONP 实现跨域通信,第 1 部分: 结合 JSONP 和 jQuery 快速构建强大的 mashup
jsonp详解—javasript/jQuery跨域请求
jQuery - AJAX load() 方法
由浅入深学习ajax跨域(JSONP)问题的更多相关文章
- jQuery的ajax跨域 Jsonp原理
1.Jsonp Jsonp(json with padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题. Jsonp是为了解决ajax跨域发送http请求出现的,利用S ...
- 【JS】AJAX跨域-JSONP解决方案(一)
AJAX跨域介绍 AJAX 跨域访问是用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面 由于安全方面的原因, 客户端js使用xmlhttprequest只能用来向来源网站发送请求 ...
- ajax跨域jsonp
<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8&qu ...
- jQuery $.ajax跨域-JSONP获取JSON数据(转载)
Asynchronous JavaScript and XML (Ajax ) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术.Ajax 允许在不干扰 Web 应用程序的显示 ...
- ajax跨域jsonp —— javascript
目录 jsonp是什么 jsonp原理 原生js使用jsonp jquery使用jsonp jsonp是什么 jsonp作用:解决跨域问题 为什么有跨域问题? “同源策略限制了从同一个源加载的文档或脚 ...
- 黑马学习Ajax 跨域资源共享 jQuery+jsonp实现
- jquery中ajax跨域加载
今天学习ajax跨域加载,先来一段代码,异步加载的链接是爱奇艺的开源,我直接拿来用作测试 <!DOCTYPE html> <html lang="en"> ...
- Ajax 跨域,这应该是最全的解决方案了
https://segmentfault.com/a/1190000012469713 前言 从刚接触前端开发起,跨域这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了 ...
- ajax跨域,这应该是最全的解决方案了
前言 从刚接触前端开发起,跨域这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了,16年时也整理过一篇相关文章,但是感觉还是差了点什么,于是现在重新梳理了一下. 个人见 ...
随机推荐
- 在.NET Core 里使用 BouncyCastle 的DES加密算法
.NET Core上面的DES等加密算法要等到1.2 才支持,我们可是急需这个算法的支持,文章<使用 JavaScriptService 在.NET Core 里实现DES加密算法>需要用 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)
系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...
- ASP.Net MVC——使用 ITextSharp 完美解决HTML转PDF(中文也可以)
前言: 最近在做老师交代的一个在线写实验报告的小项目中,有这么个需求:把学生提交的实验报告(HTML形式)直接转成PDF,方便下载和打印. 以前都是直接用rdlc报表实现的,可这次牵扯到图片,并且更为 ...
- 新手学习web遇到的一些乱码问题
在新手学习web网站学习的时候经常会遇到?????这种乱码,对于刚起步的菜鸟来说真的很头痛,很容易打击继续学的信心当然了对于菜鸟的我最近也遇到过乱码问题,沉浸其中不能自拔,爱的深啊!!!!!我所遇到的 ...
- CSS常见技巧
一.CSS Sprite(雪碧图|精灵图)指什么? 有什么作用? CSS雪碧 即CSS Sprite,也有人叫它CSS精灵,是一种CSS图像合并技术,该方法是将小图像和背景图片合并到一张图片上,然后利 ...
- 在Ubuntu下搭建Spark群集
在前一篇文章中,我们已经搭建好了Hadoop的群集,接下来,我们就是需要基于这个Hadoop群集,搭建Spark的群集.由于前面已经做了大量的工作,所以接下来搭建Spark会简单很多. 首先打开三个虚 ...
- 关于javascript中的this关键字
this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...
- C#移动跨平台开发(2)Xamarin移动跨平台解决方案是如何工作的?
概述 上一篇 C#移动跨平台开发(1)环境准备发布之后不久,无独有偶,微软宣布了开放.NET框架源代码并且会为Windows.Mac和Linux开发一个核心运行时(Core CLR),这也是开源的!I ...
- 【JavaScript吉光片羽】遭遇IE8
最初对做兼容性的认知只停留在UI层面,但其实UI层面都还好,因为毕竟你可以直接看得见现象,更为重要的是在JavaScript层面,因为这个部分涉及到功能性,前者最多是体验性的问题.下面扯一下这几天遇到 ...
- 不得不知的CLR中的GC
引言 GC 作为CLR的垃圾回收器,让程序员可以把更多的关注度放在业务上而不是垃圾回收(内存回收)上.其实很多语言也有类似的东东, 如Java也有JIT 等等 GC基本概念 垃圾回收机制的算法有好多种 ...