在 Web 开发中,后台开发人员应该会通常遇到这个问题:跨域,而使用 JSONP 就是其中解决办法之一,当然,还有其它解决方法,比如:window.name、window.postMessage、CORS、iframe 之类。本文只介绍 JSONP。

首先,看看维基关于 JSONP 定义。

 JSONP(JSON with Padding)是资料格式JSON的一种“使用模式”,可以让网页从别的网域要资料。另一个解决这个问题的新方法是跨来源资源共享。

 由于同源策略,一般来说位于server1.example.com的网页无法与不是 server1.example.com的服务器沟通,而HTML的 <script>元素是一个例外。
利用 <script>元素的这个开放策略,网页可以得到从其他来源动态产生的JSON资料,而这种使用模式就是所谓的 JSONP。用JSONP抓到的资料并不是
JSON,而是任意的JavaScript,用 JavaScript直译器执行而不是用JSON解析器解析。

通过维基百科可知,JSONP( JSONP ) 简而言之:

         在 JavaScript 中,涉及到跨域操作,通常会报出错误(SecurityError: Blocked a frame with origin "http://www.<domain>.com" from accessing a cross-origin frame.)。

          打个比方,在一个页面中,其 URL 为: www.jj.com ,而该页面中有一个 iframe,而该 iframe Src 属性值为 www.jj1.com ,在获取 iframe DOM 及进行操作,就会抛出上面错误。而在页面文件( HTML+CSS+Javascript)中,其中 script 、img、iframe等标签的 src 属性便没有这个限制,可指定取任何域链接。而 JSONP 便是利用此原理。

        关于 Javascript 判断跨域,就是简单通过 url ,如果请求 url 与当前页面 url 中 协议不同(http、https)、域名不同、端口不同,甚至一个为域名,另一个为域名解析后 IP 服务器地址,也将认定为跨域。

 JavaScript JSONP

     1 首先,在页面 www.jj.com/index.html 中 <Script type='text/javascript'></script> 标签中,自定义一个函数 function ,假设为 A,函数体逻辑根据需求而定。

     2 另外,再利用 <Script type='text/javascript' src='http://www.jj1.com/index.js'></script> src  属性无跨域限制,将 src 属性值设置为 跨域 url 地址。页面再加入该 index.js 文件,而 index.js 文件中,就是利用上一步页面中自定义的函数 A,而其内容可假设为 A()。

    3 页面通过步骤二 Script 标签远程加载的 js,而其内容为 A(),而在该页面也已经声明了 函数 A,从而就成功执行了函数,实现了页面跨域。

     

    jQuery  JSONP

    在知名 JavaScript 库:jQuery 中,同样对 JSONP 功能进行了封装,而其原理就是上方提到的 Script 标签 src 无跨域限制。不过,在 jQuery 中,因为该内容封装在 $.ajax(参数) 方法,而用户只需设置其参数(对象类型)的 datatype:”jsonp“、jsonpCallback:"函数名" (此处,若不设置,jQuery 内部将生成拼接成随机字符串),便可实现跨域。

此处,强调一点,虽然 jQuery 将 JSONP 功能封装在 $.ajax 中,而该功能实现实际与 ajax 没有任何关系,而完全是利用 script 标签 src 属性无跨域限制。

 接下来,看看在 www.jianke.com 购物车功能实现中,便利用到了 $.ajax 中 JSONP 功能。

一 javascript 代码分析

二 http 协议请求分析

     此外,本篇文章只大概讲了一下 JSONP,后续将会详细分析 $.ajax 实现原理。如有错误,烦请指正。

参考资料:http://www.cnblogs.com/twobin/p/3395086.html

https://zh.wikipedia.org/wiki/JSONP

    

JavaScript 跨域:谈谈跨域之 JSONP的更多相关文章

  1. [CORS:跨域资源共享] 同源策略与JSONP

    Web API普遍采用面向资源的REST架构,将浏览器最终执行上下文的JavaScript应用Web API消费者的重要组成部分."同源策略"限制了JavaScript的跨站点调用 ...

  2. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  3. 跨域解决方案二:使用JSONP实现跨域

    跨域的实现方式有多种,除了 上篇文章 提到的CORS外,常见的还有JSONP.HTML5.Flash.iframe.xhr2等. 这篇文章对JSONP的跨域原理进行了探索,并将我的心得记录在这里和大家 ...

  4. 什么是同源策略,什么是跨域,如何跨域,Jsonp/CORS跨域

    同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响. 可以说Web是构建在同源策略基础之上 ...

  5. 跨域知识(二)——JSONP

    JSONP是服务器与客户端跨源通信的常用方法.最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小. 它的基本思想是,网页通过添加一个<script>元素,向服务器请求JSON数据, ...

  6. Django跨域(前端跨域)

    前情回顾 在说今天的问题之前先来回顾一下有关Ajax的相关内容 Ajax的优缺点 AJAX使用Javascript技术向服务器发送异步请求: AJAX无须刷新整个页面: 因为服务器响应内容不再是整个页 ...

  7. [转]html5: postMessage解决跨域和跨页面通信的问题

    [转]html5: postMessage解决跨域和跨页面通信的问题 平时做web开发的时候关于消息传递,除了客户端与服务器传值,还有几个经常会遇到的问题: 多窗口之间消息传递(newWin = wi ...

  8. 文档通信(跨域-不跨域)、时时通信(websocket)、离线存储(applicationCache)、开启多线程(web worker)

    一.文档间的通信 postMessage对象 //不跨域 1.iframe:obj.contentWindow [iframe中的window对象] iframe拿到父级页面的window: pare ...

  9. php 跨域、跨子域,跨服务器读取session

    1.跨子域和跨服务器解决方式 Session主要分两部分:   一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在    另一个是标志着Session数据的Se ...

  10. 能跨域和跨浏览器的flashcookie for jquery插件

    对于写网站时需要跨域和跨浏览器的可以看看这个. 引入jquery  和 swfstore.min.js 就可以了,蛮简单好用的,会jquery基础就可以咯. mySwfStore.set('myKey ...

随机推荐

  1. yii2 html下拉框

    下拉框 带默认值 <?php $form=ActiveForm::begin(); echo $form->field($model,'uname', ['inputOptions'=&g ...

  2. 【转】Android屏幕适配全攻略(最权威的官方适配指导)

    原文网址:http://blog.csdn.net/jdsjlzx/article/details/45891551 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的 ...

  3. linearlayout 水平垂直居中

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  4. eclipse 工程加入ant以支持自动打war包

    先在工程的根目录下建一个一builder.xml内容如下 <project basedir="." default="war" name="hb ...

  5. hdu 1115(计算多边形重心)

    题意:已知一多边形没有边相交,质量分布均匀.顺序给出多边形的顶点坐标,求其重心. 分析: 求多边形重心的题目大致有这么几种: 1,质量集中在顶点上.n个顶点坐标为(xi,yi),质量为mi,则重心 X ...

  6. Ajax实现搜索栏中输入时的自动提示功能

    使用 jQuery(Ajax)/PHP/MySQL实现自动完成功能 JavaScript代码: <script src="jquery-1.2.1.pack.js" type ...

  7. (转)Visual Studio原生开发的10个调试技巧(二)

    我以前关于Visual Studio调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来编号).这些技巧可以应用在VS200 ...

  8. linux umask使用详解

    转自:http://blog.csdn.net/lmh12506/article/details/7281910 umask使用方法 A 什么是umask?   当我们登录系统之后创建一个文件总是有一 ...

  9. Exploit用法示例

    一.msf> show exploits与msf> show payloads:这两条命令用于展示Metaploit目录中所有可用的漏洞利用代码和攻击载荷. 二.msf> searc ...

  10. String内存陷阱简介

    String 方法用于文本分析及大量字符串处理时会对内存性能造成一些影响.可能导致内存占用太大甚至OOM. 一.先介绍一下String对象的内存占用 一般而言,Java 对象在虚拟机的结构如下:•对象 ...