JS中的跨域是受到限制的,但是跨域有时候又是必须的,藉此,各种高手牛人想尽办法使得JS能够跨域获取数据,有的方法真的很巧妙
在此记录一下常用的三种跨域方法,如下:
一、不同子域名之间的(a.example.com|b.example.com)的跨域访问。
这种跨域调用比较常见,比如a.example.com 下的 a.htm 页面,需要调用 b.example.com 下的 b.htm页面里面的getData函数, 首先需要在a.htm页面中用iframe 框架把b.htm页面引用进来
<iframe id="b" src="http://b.example.com/b.htm" frameborder="on"></iframe>
然后同时在a.htm页面与b.htm页面中设置:document.domain = "example.com"; 这样a.htm就可以获取b.htm中的window documet 然后来获取b.htm中的数据getData了,获取b.htm中的document方法为:
function getIframeDocument(id){ returen document.getElementById(id).contentDocument || document.getElementById(id).document; }
二、不同域名之间的hash传递参数(www.a.com | www.b.com)
常见的一个例子就是iframe自动适应大小,a域名下的a.htm 框架(iframe)了b域名中的b.htm,而b.htm的大小是不固定的,这时候就需要通过跨域传递b.htm的宽度与高度到a.htm中。
这个参数是怎么传递的呢?是通过hash来传递的(www.b.com/b.htm#width|height)其中#号后面的参数width|height 即为window.location.hash的值
而改变hash的值也不会造成页面的跳转,但是这样还是跨域的,所以需要在a域下增加一个c.htm中间页面,这样c.htm与a.htm之间就是相同的域下,可以传递数
据,把c.htm页面通过iframe到b.htm中,由b.htm控制,看下图: 现在的关系为,a.htm中iframe加入了b.htm,b.htm页面中iframe加入了c.htm
a.htm代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Demo</title> </head> <body> <div id="show">这是A域a</div> <iframe id="b_iframe" src="http://www.b.com/b.htm" frameborder="on" border="1px" marginwidth="0" marginheight="0" scrolling="no" allowtransparency="yes" ></iframe> </body> </html>
b.htm代码如下:
<iframe id="c_iframe" height="0" width="0" src="http://www.a.com/c.htm" style="display:none" ></iframe> <script type="text/javascript"> var b_width = Math.max(document.documentElement.clientWidth,document.body.clientWidth); var b_height = Math.max(document.documentElement.clientHeight,document.body.clientHeight); console.log(b_width); var c_iframe = document.getElementById("c_iframe"); console.log(c_iframe.src); c_iframe.src = c_iframe.src + "#" + b_width + "|" + b_height; // 这里通过hash传递b.htm的宽高 /* http://www.b.com/c.html#width|height */ </script>
c.htm代码如下:
<script type="text/javascript"> var b_iframe = parent.parent.document.getElementById("b_iframe");//a与c是同域,可以通过parent获取到a.htm中的包含b.htm的框架的dom var hash_url = window.location.hash; //这里可以获取b.htm中传递过来的width|height var hash_width = hash_url.split("#")[1].split("|")[0]+"px"; //分别获取值 var hash_height = hash_url.split("#")[1].split("|")[1]+"px"; console.log("hash_width=" + hash_width); console.log("hash_height=" + hash_height); b_iframe.style.width = hash_width; //a与c页面是同域,可以设置样式 b_iframe.style.height = hash_height;</script>
这样就可以通过hash来传递数据,缺点是只支持string类型,大小受到限制!
三、通过jsonp来实现不通域名之间跨域传递数据。
什 么是jsonp(JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用 html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。)
通俗来讲就是通过<script type="text/javascript" src="调用生成JS文件的地址并传递回调参数"></script> 来调用要执行的代码。
也可以通过createElement('script')来生成,如下:
var JSONP = document.createElement("script") ;//然后设置其src属性
因为JS文件无论在什么地方都可以调用并执行,比如各种统计JS等,回调参数是怎么回事呢,就是告诉要传递数据的页面给把数据通过这个函数传递给我,大家
大家可以试一下下面这个地址:
http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?
上面的地址是flicker的API,其中的jsoncallback=? 中的问号替换成你自定义的回调函数,然后对方就会通过这个回调函数给你传递数据:
比如随便起名一个回调函数vvgcallback:
http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=vvgcallback
然后对方生成的js就是这样的(可以把以上地址复制到地址栏测试):
vvgcallback({ "title": "Recent Uploads tagged cat", "link": "http://www.flickr.com/photos/tags/cat/", "description": "", "modified": "2012-08-15T06:07:40Z", "generator": "http://www.flickr.com/", "items": [ { "title": "A squirell about to jump", "link": "http://www.flickr.com/photos/64477042@N00/7786494040/", "media": {"m":"http://farm9.staticflickr.com/8422/7786494040_a7a506dfdc_m.jpg"}, "date_taken": "2012-08-10T15:19:40-08:00", "description": " <p><a href=\"http://www.flickr.com/people/64477042@N00/\">Dr arun kapoor<\/a> posted a photo:<\/p> <p><a href=\"http://www.flickr.com/photos/64477042@N00/7786494040/\" title=\"A squirell about to jump\"><img src=\"http://farm9.staticflickr.com/8422/7786494040_a7a506dfdc_m.jpg\" width=\"240\" height=\"191\" alt=\"A squirell about to jump\" /><\/a><\/p> <p><\/p>", "published": "2012-08-15T06:07:40Z", "author": "nobody@flickr.com (Dr arun kapoor)", "author_id": "64477042@N00", "tags": "barcelona china california birthday christmas city family flowers blue autumn friends england blackandwhite bw food dog baby india house holiday chicago canada black france flower color berlin green bird art fall film beach halloween church girl car fashion birds animals bike festival architecture clouds cat canon germany garden de geotagged fun graffiti hawaii dance football concert asia europe day florida band australia iphone instagramapp" }, { "title": "catkeywest", "link": "http://www.flickr.com/photos/marshawheatley/7786461540/", "media": {"m":"http://farm8.staticflickr.com/7120/7786461540_5e3e28bd3a_m.jpg"}, "date_taken": "2012-08-14T22:57:21-08:00", "description": " <p><a href=\"http://www.flickr.com/people/marshawheatley/\">MarshaWheatley<\/a> posted a photo:<\/p> <p><a href=\"http://www.flickr.com/photos/marshawheatley/7786461540/\" title=\"catkeywest\"><img src=\"http://farm8.staticflickr.com/7120/7786461540_5e3e28bd3a_m.jpg\" width=\"240\" height=\"180\" alt=\"catkeywest\" /><\/a><\/p> ", "published": "2012-08-15T06:08:53Z", "author": "nobody@flickr.com (MarshaWheatley)", "author_id": "85010317@N04", "tags": "old cat town florida keywest" }] })
就相当与在页面执行vvgcallback()函数,括号中间的就是传递的JSON数据。这样就想当于在你的页面里面执行了以上的代码。从而实现了跨域传递数据。
原文地址:http://www.cnblogs.com/zhangliang0115/archive/2012/08/16/2642138.html
相关推荐
为了解决跨域问题,PDF.js 提供了几种解决方案: 1. 服务器端配置:在服务器端设置 CORS 头部,允许来自其他域的请求。例如,在 Apache 或 Nginx 配置中添加 `Access-Control-Allow-Origin` 头,指定允许访问的源...
本文将详细介绍四种主要的JavaScript跨域方式:JSONP、修改`document.domain`、使用`window.name`以及HTML5的`window.postMessage`。 ### 1. JSONP(JSON with Padding) JSONP是一种解决跨域问题的早期方法,它利用...
在Web开发中,JavaScript(JS)的同源策略限制了不同源之间进行交互,包括从一个页面中的脚本访问另一个不同源的IFrame内容。"解决JS跨域访问IFrame的解决方案"这一主题关注的就是如何克服这个限制,使得在JSP页面中...
针对JavaScript跨域,有以下几种常见的解决方法: 1. JSONP(JSON with Padding):JSONP是一种绕过同源策略的方法,它利用`<script>`标签可以跨域加载脚本的特性。通过动态创建`<script>`标签,并设置其`src`属性...
跨域问题通常在 JavaScript 中是个常见的安全限制,浏览器不允许脚本从一个源(域名、协议或端口)请求另一个源的资源,以防止恶意网站通过脚本读取其他网站的数据。在 PDF.js 原版中,如果 PDF 文件存储在与网页...
海康威视h5player.js 2.0版 跨域隔离解决方案 海康威视h5player.js 2.0版为提升解码性能,采用了多线程解码技术,使用SharedArrayBuffer来完成多线程之间的数据交互。然而,SharedArrayBuffer等高级功能可被攻击者...
在GIS(地理信息系统)开发中,ArcGIS JavaScript API(arcgis js)是Esri公司提供的一款强大的Web GIS开发工具,用于构建地图应用。然而,在实际开发过程中,由于浏览器的同源策略限制,当我们在不同域名下尝试访问...
jcrossdomain是一个专门用于解决JavaScript跨域问题的工具,尤其适用于需要双向通信的场景。它通过创建隐藏的IFrame和利用window.postMessage API来实现跨域通信。window.postMessage是HTML5引入的一个API,允许来自...
JavaScript跨域是Web开发中一个常见的挑战,由于浏览器的同源策略限制,JavaScript无法直接访问不同源(协议、域名或端口不一致)的资源。本文将深入探讨JS跨域的解决方案,帮助开发者理解并解决这个问题。 首先,...
在使用ArcGIS API for JavaScript开发Web应用程序时,经常会遇到跨域问题。这是因为浏览器的安全策略限制了JavaScript从一个源(域名、协议或端口)请求另一个源的数据。ArcGIS API for JavaScript是一个强大的工具...
JavaScript跨域对象类是一种在Web开发中解决同源策略限制的技术。同源策略是浏览器为了保护用户数据安全而设定的一项安全政策,它规定了只有来自相同域名的HTTP请求才能互相访问资源,不同源的请求会被阻止。然而,...
### JS解决跨域访问问题详解 #### 一、引言 在现代Web开发中,跨域访问问题是开发者经常面临的一个挑战。特别是在使用JavaScript进行前后端交互时,由于浏览器的同源策略限制,开发者经常会遇到跨域问题。本文将...
### JavaScript父子页面跨域通信详解 #### 一、引言 在现代Web开发中,跨域通信是一个常见的问题。由于浏览器的安全策略——同源策略(Same-origin policy)的存在,JavaScript在处理不同源之间的数据交互时会受到...
JavaScript跨域问题是一个在开发Web应用时经常遇到的技术挑战,主要涉及到浏览器的同源策略(Same-Origin Policy)。同源策略是浏览器为了保护用户信息安全而设置的一种安全机制,它限制了来自不同源(协议+域名+...
在Web开发中,"跨域调用"是一个关键的话题,特别是在使用JavaScript进行AJAX操作时。由于浏览器的同源策略(Same-Origin Policy),一个域下的文档或脚本不能请求另一个域下的资源,除非这两个域完全相同。这限制了...
JavaScript跨域问题,是Web开发中常见的一个挑战,由于浏览器的同源策略限制,JavaScript无法直接访问不同源的资源,这在实现某些功能时会带来不便。本文将深入探讨JavaScript跨域问题的原因、影响以及多种解决方案...
在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它允许页面在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容。然而,由于浏览器的安全策略,AJAX默认无法直接访问...
JavaScript 和 jQuery 是Web开发中广泛使用的两种技术,它们在实现跨域访问方面起着关键作用。跨域访问是Web应用程序中常见的需求,特别是在Ajax请求、API调用或数据共享时。由于浏览器的安全策略,不同域名、协议或...
JS跨域访问解决