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

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

  1. JSONPJSON with Padding)是资料格式JSON的一种“使用模式”,可以让网页从别的网域要资料。另一个解决这个问题的新方法是跨来源资源共享。
  2.  
  3. 由于同源策略,一般来说位于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. python开发学习-day01 (python安装与版本、字符串、字典、运算符、文件)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  2. java 构造函数内部的多态方法 完全剖析

    我们先来看一个例子,如果你读过<java编程思想>的话 应该会有印象 package com.test.zj; public class PolyConstructors { public ...

  3. Eclipse将android项目打包jar文件

    Eclipse+android打包jar文件 蔡建良 2016-3-12 以Android-SlideExpandableListView开源框架为例,将源码Library打包成jar文件并包含R.c ...

  4. phonegap 使用极光推送实现消息推送

    最近一直在研究各种推送,ios的由于是apns,比较容易实现,但是andriod的就比较麻烦.后来看了很多解决方案,gcm明显是不行的,其他的方案更是一头雾水,而且需要做第二次开发,太麻烦,后来就选择 ...

  5. web-ylbtech-数据库备份-数据库设计

    ylbtech-DatabaseDesgin:web-ylbtech-数据库备份-数据库设计 DatabaseName:ylbtech Model:备份 Type:数据库备份设计 Url: 1.A,数 ...

  6. Java中的OutOfMemoryError的各种情况及解决和JVM内存结构

    在JVM中内存一共有3种:Heap(堆内存),Non-Heap(非堆内存) [3]和Native(本地内存). [1] 堆内存是运行时分配所有类实例和数组的一块内存区域.非堆内存包含方法区和JVM内部 ...

  7. nginx 的模块及处理流程

         nginx的内部结构是由核心部分和一系列的功能模块所组成.这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展.这样的模块化设计类似于面向对象中的接口类,它增强了 ...

  8. 判断图片加载完成,自适应iframe高度

    在做RSS订阅的时候遇到这样一个问题:点击文章标题时,弹出文章的详细界面.本来打算直接用弹出div层来显示文章的内容,但是设置div的overflow:scroll滚动条不好看,还有就是在androi ...

  9. JS简单入门教程

    JS简单教程 使用方法:放到任意html页面的head标签下 Test1方法弹出当前时间对话框 Test2方法for循环输出 Test3方法for(…in…)输出数组内容 <script typ ...

  10. 手势冲突UIPanGestureRecognizer 和UIPinchGestureRecognizer

    当同时使用pan和pin手势时假如冲突,需要加入下面方法 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shou ...