1. 程式人生 > >JS 跨域訪問的幾種方式

JS 跨域訪問的幾種方式

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/[email protected]/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/[email protected]/\">Dr arun kapoor<\/a> posted a photo:<\/p> <p><a href=\"http://www.flickr.com/photos/[email protected]/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": "[email protected] (Dr arun kapoor)",
            "author_id": "[email protected]",
            "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": "[email protected] (MarshaWheatley)",
            "author_id": "[email protected]",
            "tags": "old cat town florida keywest"
       }]
})
複製程式碼

就相當與在頁面執行vvgcallback()函式,括號中間的就是傳遞的JSON資料。這樣就想當於在你的頁面裡面執行了以上的程式碼。從而實現了跨域傳遞資料。


相關推薦

解決瀏覽器方式

doc cor 求和 對象 跨域 http onf 從服務器 console 1、什麽是跨域問題 在頁面中使用js訪問其他網站的數據時,就會出現跨域問題,比如在網站中使用ajax請求其他網站的天氣、快遞或者其他數據接口時,以及hybrid app中請求數據,

web前端之方式

一、什麼是跨域 JavaScript出於安全方面的考慮,不允許跨域呼叫其他頁面的物件。那什麼是跨域呢,簡單地理解就是因為JavaScript同源策略的限制,a.com域名下的js無法操作b.com或是c.a.com域名下的物件。 當協議、子域名、主域名、埠號中任意一個不相同時,都算作不

方式

什麼是跨域? 跨域:就是不同域之間進行相互資源請求; 例如:http://www.test.com/index.com  請求  http://www.test01.com/server.php

Vue專案中方式

經常使用vue + webpack搭建專案,但在請求某些json資料時存在跨域問題,此時有幾種修改方法 1. 修改後臺header, 但如果只是請求外部資料,是沒法修改後臺配置的 1 header('Access-Control-Allow-Origin:*');//允許所有來源

關於,以及方式

名詞解釋:跨域:瀏覽器對於javascript的同源策略的限制,例如a.cn下面的js不能呼叫b.cn中的js,物件或資料(因為a.cn和b.cn是不同域),所以跨域就出現了.上面提到的,同域的概念又是什麼呢??? 簡單的解釋就是相同域名,埠相同,協議相同同源策略:請求的ur

關於,以及方式

轉載:https://www.cnblogs.com/chenshishuo/p/4919224.html首先我們來想一想              為什麼會有跨域這個名詞的出現呢?              跨域又是什麼呢?為何要跨域?              瀏覽器的同

詳解方式

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。 一、什麼是跨域 JavaScript出於安全方面的考慮,不允許跨域呼叫其他頁面的物件。那什麼是

前端解決 API 方式

文章目錄 使用 webpack 配置代理 使用 http-server 模組進行代理 使用 nodejs 的 node-http-proxy 模組來處理 使用 nginx 配置

關於瀏覽器方式

什麼是跨域?只要協議、域名、埠有任何一個不同,都被當作是不同的域,之間的請求就是跨域操作。http://www.123.com/index.html 呼叫 http://www.123.com/server.php (非跨域)http://www.123.com/index.

前端方式

前言 受瀏覽器同源策略的限制,本域的js不能操作其他域的頁面物件(比如DOM)。但在安全限制的同時也給注入iframe或是ajax應用上帶來了不少麻煩。所以我們要通過一些方法使本域的js能夠操作其他域的頁面物件或者使其他域的js能操作本域的頁面物件(iframe之間)。 這

前端處理方式

javascrip ssa hello red 解決 ons 單向 靜態資源 目標接口 什麽是跨域? 跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源,這裏跨域是廣義的。 廣義的跨域: 1、資源跳轉:A鏈接、重定向、表單提交 2、資源嵌入: <link>、

方式:cors.jsonp.iframe

cors:是發起請求時候,傳遞一個特定引數給跨域的伺服器,伺服器接收到這個引數後,在responseHeaders裡面加一個欄位Access-Control-Allow-Origin, 比如你的域名是。www.qq.com,要請求www.baidu.com的介面那麼欄位

JS 訪問方式

JS中的跨域是受到限制的,但是跨域有時候又是必須的,藉此,各種高手牛人想盡辦法使得JS能夠跨域獲取資料,有的方法真的很巧妙 在此記錄一下常用的三種跨域方法,如下: 一、不同子域名之間的(a.example.com|b.example.com)的跨域訪問。   這種跨域呼叫

js中實現方法

js中幾種實用的跨域方法原理詳解 這裡說的js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向一個不同的域請求資料,或者通過js獲取頁面中不同域的框架中(iframe)的資料。只要協議、域名、埠有任何一個不同,都被當作是不同的域。 下表給出了相對http://sto

處理方式

前言 本文簡單介紹什麼是跨域,出現跨域的情況以及跨域的幾種處理方式。 一、什麼是跨域 我們先回顧一下域名地址的組成: http:// www . google : 8080 / script/jquery.js   http:// (協議號)   www  (子域名)   google (主域名

web前端js的兩實現方式jsonp和src

                $.ajax(        {            type:'get',            url : "http://192.168.120.77:8081/queryTopPageParams?callback=?",            dataType :

常見的解決方式

今天給大家分享一下,修真院官網JSS-5任務中可能會使用到的知識點:1.背景介紹1.1什麼是跨域?跨域是指一個域下的文件或指令碼試圖去請求另一個域下的資源,這裡跨域是廣義的。廣義的跨域:1.) 資源跳轉: A連結、重定向、表單提交2.) 資源嵌入: link script i

方法實現js訪問

javascript跨域訪問是web開發者經常遇到的問題,什麼是跨域,一個域上載入的指令碼獲取或操作另一個域上的文件屬性,下面將列出三種實現javascript跨域方法: 1.基於iframe實現跨域       基於iframe實現的跨域要求兩個域具有aa.xx.com,

JS實現繼承的方式(轉)

多繼承 logs 影響 .cn sta 初始化 定義 附錄 style 轉自:幻天芒的博客 前言 JS作為面向對象的弱類型語言,繼承也是其非常強大的特性之一。那麽如何在JS中實現繼承呢?讓我們拭目以待。 JS繼承的實現方式 既然要實現繼承,那麽首先我們得有一個父類,

JS實現繼承的方式

簡單 成員 類構造 缺陷 屬性 con html 但是 內存 JS實現繼承的幾種方式 前言 JS作為面向對象的弱類型語言,繼承也是其非常強大的特性之一。那麽如何在JS中實現繼承呢?讓我們拭目以待。 JS繼承的實現方式 既然要實現繼承,那麽首先我們得有一個父類,代碼如