浅谈JSONP

这是我在13年初写的文章,当时懵懵懂懂写下了自己对JSONP的理解。

文章原文

博客 欢迎订阅


提到JSONP,我当时在网上找了无数帖子也没有看懂它。那些文章大同小异,都是讲到JSONP原理以后就戛然而止,把我们这些初学者搞得云里雾里。所以,写下这篇文章,希望对大家有帮助!

为什么要有JSONP

回答这个问题之前,大家先想想什么是AJAX,JSONP就是一种能够解决AJAX办不到的事情而存在的一种取数据的技术。什么事情是AJAX办不到的呢?就是跨域!

跨域:顾名思义,就是当前网页的地址和我们要取的数据地址不在一个域下。这是因为浏览器都有一个“同源策略”— 两个页面的域名必须在同域的情况下,才能允许通信。

怎么才算一个域呢?

相同域名,相同端口,相同协议(因为不是这里的重点,大家可以请教Google)

“同源策略”的意义:“同源策略”有效地阻止了一些危险行为,比如你进入www.aaa.com,同时浏览器又开了一个www.bbb.com,如果这个www.bbb.com是一个木马网站,在没有“同源策略”的情况下,它就可能嵌入一些代码,来取得你在www.aaa.com的信息(因为这时两个页面是可以通信的) 。而正是因为有了“同源策略”,刚才可以通信的情况才不会发生。

“同源策略”带来的麻烦:上面的例子是我们在不知情的情况下,保护我们的网络安全的,但如果我们就是要让www.aaa.com取得www.bbb.com上的数据,行不行呢?答:不行!还是因为”同源策略”!我们想从自己信任的网页上取得数据都不行,这可怎么办呢?

JSONP出现

在需要跨域通信的岁月里,一些卓越的前端工程师们想到了这个”作弊”的办法来逃避”同源策略”。”同源策略”虽然很厉害,阻止了一个页面到另一个页面的通信,可是src指向的路径它放过了,提到src,大家是不是想起了<script>?对,JSONP就是利用”同源策略”的这一”漏洞”来进行”作弊”的。(其实有src属性的不止有<script>,还有<img><iframe>,而<iframe>也是能够运用JSONP的)。

下面看看JSONP的原理:

JSONP:JSON with PaddingJSON大家这都知道,是一种数据通信格式,而”Padding”是什么意思,别急,往下看就知道了。

我们先举一个简单的例子:

www.aaa.com中:

<script type="text/javascript" src="http://www.bbb.com/abc.js"></script>
<script type="text/javascript">function abc(json){alert(json['name']); }
</script>

www.bbb.com/abc.js中:

abc({'name':'risker','age':24});

页面会弹出risker,有感觉了么?

JSONP是这样工作的:像前面所说的那样,我们可以取到www.bbb.com/abc.js,里面是一个abc函数,这个函数也会被加载到www.aaa.com。加载完成后,就应该执行abc了,然后我们在www.aaa.com定义abc函数,这个函数里写一些处理数据的语句。这样其实就简单地实现了跨域访问数据了,这也就是JSONP的原理了。而JSON with Padding的意思,就是abc(json)中的json
abc({'name':'risker','age':24})

这个JSON对象被包在abc这个函数中当作参数来被处理,而JSON with Padding这个词很形象地形容了这个过程。

JSONP的简单实例

在网上能找到的JSON基本只是介绍到这里就完了,但是这让初学者看不到一个实实在在的例子。所以下面才是这篇文章和其他网上介绍JSON文章不一样的地方,我带给大家一个例子!
大家一定对百度的自动搜索框有印象,它就是一个JSONP的实例:

62504685.jpg

先查看demo

分析一下:

1.分析数据地址回顾上面的例子,我们首先要知道数据的来源地址,就是上面的www.bbb.com/abc.js里的数据。在Chrome中查看Network。然后随便在搜索框里输入点什么,比如s,观察Network里是不是多了东西,点开它,就是我们输入“s”后传回的数据了:

82372497.jpg

这个地址是http://suggestion.baidu.com/su?wd=S&p=3&cb=window.bdsug.sug&from=superpage&t=1365392859833 , 我们分析一下,wd后面是s,那就可以断定百度定义wd是搜索的关键字,cb是一个回调函数,其他的对我们就不重要了。回调函数是我们取到数据要后执行的函数,相当于我们上面的abc函数。它是可以自己取名的。像http://suggestion.baidu.com/su?wd=S&p=3&cb=succ&from=superpage表示取到数据后执行succ函数:

28602969.jpg

这样,我们的数据就包在了succ函数里做一个参数,再次证明了JSON with Padding 的原理。

2.做<script>标签,其src指向数据地址:这是要动态生成的,不能把地址写死,要不然取到的都是一样的数据了。所以我们要动态生成<script>,动态指定src属性:

var oScript = document.createElement('script');
oScript.src = 'http://suggestion.baidu.com/su?wd='+oTxt.value+'&amp;p=3&amp;cb=succ&amp;from=superpage';
document.body.appendChild(oScript);

3.不要以为这样问题就解决了,F12一下,就看到生成了好多<script>!这是因为我们每输入一个字符就动态生成一个<script>,造成了代码冗余!解决一下:

if(oScript){
document.body.removeChild(oScript);
}

好,这样,我们的搜索框效果就做好了,因为主要讲JSONP部分的工作原理,就不做成百度下拉框那样了,大家可以自己去布局。当然,真正的百度搜索框还要在此基础上涉及事件的冒泡取消等等,就不是这里的重点了,不做阐述。

JSONP总结

  1. JSONP是为了传数据而存在的技术。网页之间的通信原本有AJAX就够了,而AJAX因为浏览器“同源策略”面对跨域情况就束手无策了。JSONP就这样被发明了,利用<script>src属性不受“同源策略”的控制,“作弊”般地巧妙地逃过了浏览器的这一限制。

  2. JSONP方法本质是创建<script>标签,其src指向我们的数据地址。地址后面附带一个回调函数(名字一般是callback或者是别的什么,就看后台给我们的是什么了,函数名是我们起的)。然后,声明这个回调函数。这样,只要一引入上面的<script>标签,就相当于执行了那个回调函数。

  3. 虽然jQuery把JSONP内置在了AJAX里,但是我们一定要清楚,AJAX和JSONP是完全不一样的,一定不要混淆!以后我会更新一篇介绍AJAX的文章的。

  4. 这里是前端和后台的交汇之处,想要真正融会贯通,还要学学后台的知识。我也是在学了PHP之后才把JSONP搞懂的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Asp.Net Core 7 preview 4 重磅新特性--限流

前言限流是应对流量暴增或某些用户恶意攻击等场景的重要手段之一&#xff0c;然而微软官方从未支持这一重要特性&#xff0c;AspNetCoreRateLimit这一第三方库限流库一般作为首选使用&#xff0c;然而其配置参数过于繁多&#xff0c;对使用者造成较大的学习成本。令人高兴的是&…

【计算机图形学】实验:C#.net环境下采用GDI+图形特技处理案例教程

一、实验目的 掌握在.net环境下对图形特技的处理方法。 二、实验准备 学习在.net环境下读取图像文件、改变颜色等基本知识。 三、实验内容 在.net环境中实现对图像的灰度化处理、柔化和锐化、底片滤镜、淡入淡出以及浮雕、油画和木刻等艺术效果。 四、实验过程及步骤 (…

Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分

如果开发的应用用户较多&#xff0c;那么必须保证应用在多个版本不同的设备上能够正确的运行。这就要求对各个版本比较熟悉&#xff0c;知道在什么版本中加入了什么新的功能或特性。但是Android的版本太多了&#xff0c;是个令人头疼的问题。如果想了解Android的版本差异&#…

[python opencv 计算机视觉零基础到实战] 一 opencv的helloworld

前置条件 说明&#xff1a;本系列opencv实战教程将从基础到实战&#xff0c;若只是简单学习完python也可以通过该教程完成一般的机器学习编程&#xff1b;文中将会对很多python的基础内容进行讲解&#xff0c;但由于文章定位的原因将不会赘述过多的基础内容&#xff0c;基础内…

【计算机图形学】实验:VB.net环境下的综合绘图与交互技术案例教程

一、实验目的 掌握在.net环境下的绘图软件界面设计与交互技术。 二、实验准备 学习在.net环境下的界面设计的一般原理与交互技术等基本知识。 三、实验内容 将前7个实验内容集成到一个界面下&#xff0c;如直线段、圆、矩形与曲线的绘制填充&#xff0c;以及对图像的处理&…

从头开始敲代码之《从BaseApplication/Activity开始》

转载请注明出处王亟亟的大牛之路 其安易持&#xff0c;其未兆易谋&#xff1b;其脆易泮&#xff0c;其微易散。为之于未有&#xff0c;治之于未乱。合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于垒土&#xff1b;千里之行&#xff0c;始于足下。为者败之…

查缺补漏系统学习 EF Core 6 - 原始 SQL 查询

推荐关注「码侠江湖」加星标&#xff0c;时刻不忘江湖事这是 EF Core 系列的第五篇文章&#xff0c;上一篇文章盘点了 EF Core 中的几种数据查询方式。但是有有时候&#xff0c;我们可能无法用标准的 LINQ 方法完成查询任务。或者编译后的 LINQ 查询&#xff0c;没有我们想要的…

【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取

一、学习目标 了解图片的结构属性了解如何捕获视频了解waitkey的使用方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python opencv 计…

C# WPF后台动态添加控件(经典)

概述在Winform中从后台添加控件相对比较容易&#xff0c;但是在WPF中&#xff0c;我们知道界面是通过XAML编写的&#xff0c;如何把后台写好的控件动态添加到前台呢&#xff1f;本节举例介绍这个问题。这里要用到UniformGrid布局&#xff0c;UniformGrid 是一种横向的网格分割、…

【Envi风暴】Envi 5.4遥感影像镶嵌原来如此简单!

图像镶嵌指是在一定的数学基础控制下,把多景相邻的遥感图像拼接成一个大范围、无缝图像的过程。 Envi的图像镶嵌功能提供交互式的方式将没有地理坐标或者地理坐标的多幅图像合并,生成一幅单一的合成图像。镶嵌功能提供了透明处理、匀色、羽化等功能。 下面演示基于地理坐标(…

[python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑

一、学习目标 了解图片的通道与数组结构了解使用numpy创建一个图片了解使用numpy对图片的一般操作方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的hel…

java 常用类库_JAVA(三)JAVA常用类库/JAVA IO

成鹏致远 |lcw.cnblog.com|2014-02-01JAVA常用类库1.StringBufferStringBuffer是使用缓冲区的&#xff0c;本身也是操作字符串的&#xff0c;但是与String类不同&#xff0c;String类的内容一旦声明之后则不可改变&#xff0c;改变的只是其内存地址的指向&#xff0c;而StringB…

Android之国际化部分文字生效而部分文字没有生效的坑

1 问题 Android国际化我们知道只要在res目录下面&#xff0c;创建不同国家的文件夹然后&#xff0c;把不同国家对于的语言以键值对的方式写进strings.xml文件就行&#xff0c;这是一个非常简单的操作&#xff0c;但是今天遇到了一个很奇葩的问题&#xff0c;在部分手机&#x…

【中间件】c#/.net使用GZY.Quartz.MUI搭建可视化的定时任务面板

GZY.Quartz.MUI是在github上开源的aspnetcore项目, 它旨在帮助开发人员通过面板来设置定时任务&#xff0c;主要想做的就是:像swaggerUI一样,项目入侵量小,仅需要在Startup中注入的UI组件官方地址:https://www.cnblogs.com/GuZhenYin/p/15745002.html主要功能1.增加本地json持久…

iOS UI基础-7.0 UIScrollView

概述 移动设备的屏幕大小是极其有限的&#xff0c;因此直接展示在用户眼前的内容也相当有限.当展示的内容较多&#xff0c;超出一个屏幕时&#xff0c;用户可通过滚动手势来查看屏幕以外的内容,普通的UIView不具备滚动功能&#xff0c;不能显示过多的内容。UIScrollView是一个能…

【ArcGIS风暴】缓冲区分析、叠置分析综合实验案例:购房区域的选择

实验平台:ArcGIS 9.3实验目的:熟练掌握A rcGIS缓冲区分析和叠置分析操作,综合利用各项空间分析工具解决实际问题。实验要求:对每个条件进行缓冲区分析,运用空间叠置分析对多个图层叠加,并分等级,确定合适的区域。实验数据:ArcEx8实验步骤打开ArcMap,加载数据ArcEx8,如…

[python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解

一、学习目标 了解什么是色彩空间了解opencv中色彩空间的转换 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python opencv 计算机视觉零基…

java gui 按键 数组_java GUI分配数组值

好的,所以这是一个非常基本的例子.它需要更多的工作和优化,但应该让你朝着正确的方向前进import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.Shape;im…

poj1189 简单dp

http://poj.org/problem?id1189 Description 有一个三角形木板,竖直立放。上面钉着n(n1)/2颗钉子&#xff0c;还有(n1)个格子&#xff08;当n5时如图1&#xff09;。每颗钉子和周围的钉子的距离都等于d&#xff0c;每一个格子的宽度也都等于d&#xff0c;且除了最左端和最右端…

WPF|如何在 WPF 中设计漂亮的社交媒体信息仪表板

1. 效果展示先来直接欣赏效果&#xff1a;2. 准备创建一个WPF工程&#xff0c;比如站长使用 .NET 7[1] 创建名为 Dashboard3 的WPF项目&#xff0c;添加一些图片资源&#xff0c;项目目录如下&#xff1a;2.1 图片资源可在网站 iconfont[2] 下载 关闭、最小化 图标&#xff0c;…