`

【转】JavaScript 中的跨域访问方法

阅读更多

http://www.cnblogs.com/NNUF/archive/2012/08/15/2639793.html

 

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数据。这样就想当于在你的页面里面执行了以上的代码。从而实现了跨域传递数据。

分享到:
评论

相关推荐

    Javascript跨域访问解决方案

    Javascript跨域访问解决方案 个人在网上搜集的资料,用于传输信息,不提倡下载

    javascript跨域访问的方法.pdf

    ...

    javascript跨域访问的方法.docx

    ...

    javascript/jquery 跨域访问

    NULL 博文链接:https://y-l.iteye.com/blog/2074102

    JS跨域访问

    javascript 跨域访问 综合解决方案

    JavaScript cookie 跨域访问之广告推广

    主要介绍了JavaScript cookie 跨域访问之广告推广 的相关资料,需要的朋友可以参考下

    Javascript 跨域访问解决方案

    由于安全方面的考虑,Javascript被限制了跨域访问的能力,但是有时候我们希望能够做一些合理的跨域访问的事情,那么怎么办呢?

    jquery跨域访问

    jquery跨域访问服务器,用的是一个jquery的插件,要配合jquery使用。 &lt;script type="text/javascript"&gt; $(document).ready( function(){ $.get('http://smallbridge.sinaapp.com/', function(res){ $('#testdiv')....

    Javascript AJAX跨域Flash辅助插件Ajaxf.zip

    Javascript跨域传输数据存在很大的限制,通过普通的方式很难突破这个限制,通常使用API来跨域,更经常看到的是通过页面代理的方式访问,这样实现起来很繁琐,效率也很低,所以也就搞出了这个插件,通过Flash来实现...

    js实现跨域访问的三种方法

    javascript跨域访问是web开发者经常遇到的问题,什么是跨域,一个域上加载的脚本获取或操作另一个域上的文档属性,下面将列出三种实现javascript跨域方法: 1.基于iframe实现跨域 基于iframe实现的跨域要求两个域...

    JavaScript同源策略和跨域访问实例详解

    本文实例讲述了JavaScript同源策略和跨域访问。分享给大家供大家参考,具体如下: 1. 什么是同源策略 理解跨域首先必须要了解同源策略。同源策略是浏览器上为安全性考虑实施的非常重要的安全策略。 何谓同源: URL由...

    常见的javascript跨域通信方法

    本文主要介绍几种常见的javascript跨域通信方法。首先讲解一下JSONP。 1、JSONP JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server...

    JavaScript中跨域调用Flash的方法

    相信JavaScript与Flash交互大家都会有所接触或者有所耳闻。其实我也是第一次整这个玩意。具体的方法就不说了,很多资料。 开始的时候功能都做得差不多了,实现和没问题。可是就是到了最后,将swf文件放到资源服务上...

    AJAX javascript的跨域访问执行

    在网站调用加载评论等信息的时候遇到了不同域名间javascript不能执行的问题,一直都在加载中显示不出来,而换个网址访问的话就能正确显示,一直没去注意浏览器提示的错误信息:

    JSONP实现Ajax跨域访问

    主要从三方面来通过jsonp来实现ajax跨域问题: 1.javascript方法 2.jquery $.ajax方法 3.jquery $.getJSON方法 不看会后悔的!

    flash跨域访问

    &lt;script type="text/javascript"&gt; $(document).ready(function() { $.ajaxf.install('/Files/zsea/AJAX.swf'); $("#fdemo_get").click(function() { $.ajaxf.getText("http://www.youku.com/", '', function(r) ...

    AJAXCDR:利用 Flash 完美解决 JavaScript 和 AJAX 跨域 HTTP POST/GET 表单请求

    JavaScript 和 AJAX 跨域访问分为两大类,一是本域和子域的交互,二是本域和其他域的交互。  一、本域和子域的交互:www.s135.com 和 blog.s135.com  二、本域和其他域的交互:blog.s135.com 和 api.bz  本域和...

    arcgis api for js 4.x 在tomcat离线部署后,跨域访问问题

    arcgis api for js 4.x 在tomcat离线部署后,跨域访问问题,彻底解决。

    javascript跨域方法、原理以及出现问题解决方法(详解)

    javascript跨域访问是web开发者经常遇到的问题,什么是跨域,一个域上加载的脚本获取或操作另一个域上的文档属性,下面将列出三种实现javascript跨域方法: 1.基于iframe实现跨域  基于iframe实现的跨域要求两个域...

    ajax跨域访问案例.zip

    个人学习时编写的代码,该案例用于演示Ajax的跨域访问问题。!!!补充说明:导入工程时需要选择导入maven工程!上传仅为学习交流,也为自己下载方便!水平有限不喜勿喷。在README.txt中有对项目的详细说明!

Global site tag (gtag.js) - Google Analytics