最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript跨域的方法匯總

 更新時間:2015年10月23日 11:56:58   投稿:hebedich  
JavaScript出于安全方面的考慮,不允許跨域調(diào)用其他頁面的對象。但在安全限制的同時也給注入iframe或是ajax應(yīng)用上帶來了不少麻煩。這里把涉及到跨域的一些問題簡單地整理一下

此文章學(xué)習(xí)借鑒了一些其他前端同學(xué)的文章,自己做了個實踐總結(jié)

以下的例子包含的文件均為為 http://www.a.com/a.html 、http://www.a.com/c.htmlhttp://www.b.com/b.html,要做的都是從a.html獲取b.html里的數(shù)據(jù)

1.JSONP

jsonp是利用script標(biāo)簽沒有跨域限制的特性,通過在src的url的參數(shù)上附加回調(diào)函數(shù)名字,然后服務(wù)器接收回調(diào)函數(shù)名字并返回一個包含數(shù)據(jù)的回調(diào)函數(shù)

  function doSomething(data) {
    // 對data處理
  }
  var script = document.createElement("script");
  script.src = "http://www.b.com/b.html?callback=doSomething";
  document.body.appendChild(script);

  // 1.生成一個script標(biāo)簽,將其append在body上,向服務(wù)器發(fā)出請求
  // 2.服務(wù)器根據(jù) callback 這個參數(shù)生成一個包含數(shù)據(jù)的函數(shù) doSomething({"a", "1"})
  // 3.頁面事先已聲明doSomething函數(shù),此時執(zhí)行 doSomething(data) 這個函數(shù),獲得數(shù)據(jù)

2.HTML5的postMessage

假設(shè)在a.html里嵌套個<iframe src="

a.html

  window.onload = function() {
    window.addEventListener("message", function(e) {
      alert(e.data);
    });

    window.frames[0].postMessage("b data", "http://www.b.com/b.html");
  }

b.html

  window.onload = function() {
    window.addEventListener("message", function(e) {
      alert(e.data);
    });
    window.parent.postMessage("a data", "http://www.a.com/a.html");
  }

這樣打開a頁面就先彈出 a data,再彈出 b data

3.window.name + iframe

window.name的原理是利用同一個窗口在不同的頁面共用一個window.name,這個需要在a.com下建立一個代理文件c.html,使同源后a.html能獲取c.html的window.name

a.html

  var iframe = document.createElement("iframe");
  iframe.src = "http://www.b.com/b.html";
  document.body.appendChild(iframe); // 現(xiàn)在a.html里建一個引用b.html的iframe,獲得b的數(shù)據(jù)

  var flag = true;
  iframe.onload = function() {
    if (flag) {
      iframe.src = "c.html"; 
// 判斷是第一次載入的話,設(shè)置代理c.html使和a.html在同目錄同源,這樣才能在下面的else取到data
      flag = false;
    } else { // 第二次載入由于a和c同源,a可以直接獲取c的window.name
      alert(iframe.contentWindow.name);

      iframe.contentWindow.close();
      document.body.removeChild(iframe);
      iframe.src = '';
      iframe = null;
    }
  }

b.html

window.name = "這是 b 頁面的數(shù)據(jù)";

4.window.location.hash + iframe

b.html將數(shù)據(jù)以hash值的方式附加到c.html的url上,在c.html頁面通過location.hash獲取數(shù)據(jù)后傳到a.html(這個例子是傳到a.html的hash上,當(dāng)然也可以傳到其他地方)

a.html

  var iframe = document.createElement("iframe");
  iframe.src = "http://www.b.com/b.html";
  document.body.appendChild(iframe); // 在a頁面引用b
  function check() { // 設(shè)置個定時器不斷監(jiān)控hash的變化,hash一變說明數(shù)據(jù)傳過來了
    var hashs = window.location.hash;
    if (hashs) {
      clearInterval(time);
      alert(hashs.substring(1));
    }
  }
  var time = setInterval(check, 30);

b.html

  window.onload = function() {
    var data = "this is b's data"; 
    var iframe = document.createElement("iframe");
    iframe.src = "http://www.a.com/c.html#" + data;
    document.body.appendChild(iframe); // 將數(shù)據(jù)附加在c.html的hash上
  }

c.html

// 獲取自身的hash再傳到a.html的hash里,數(shù)據(jù)傳輸完畢
parent.parent.location.hash = self.location.hash.substring(1); 

5.CORS

CORS是XMLHttpRequest Level 2 里規(guī)定的一種跨域方式。在支持這個方式的瀏覽器里,javascript的寫法和不跨域的ajax寫法一模一樣,只要服務(wù)器需要設(shè)置Access-Control-Allow-Origin: *

6.document.domain

這種方式適用于主域相同,子域不同,比如http://www.a.comhttp://b.a.com
假如這兩個域名下各有a.html 和b.html,

a.html

  document.domain = "a.com";
  var iframe = document.createElement("iframe");
  iframe.src = "http://b.a.com/b.html";
  document.body.appendChild(iframe);
  iframe.onload = function() {
    console.log(iframe.contentWindow....); // 在這里操作b.html里的元素數(shù)據(jù)
  }

b.html

  document.domain = "a.com";

注意:document.domain需要設(shè)置成自身或更高一級的父域,且主域必須相同。

相關(guān)文章

  • 原生js實現(xiàn)放大鏡特效

    原生js實現(xiàn)放大鏡特效

    這篇文章主要為大家詳細(xì)介紹了原生js實現(xiàn)放大鏡特效,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • three.js實現(xiàn)3d全景看房示例

    three.js實現(xiàn)3d全景看房示例

    這篇文章主要為大家介紹了three.js實現(xiàn)3d全景看房示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 10個基于瀏覽器的JavaScript調(diào)試工具分享

    10個基于瀏覽器的JavaScript調(diào)試工具分享

    調(diào)試Javascript可能是web開發(fā)中最讓人郁悶的事情,這里是10款我們精選的基于瀏覽器的JS在線調(diào)試工具,感興趣的朋友可以參考下,或許對你有所幫助
    2013-02-02
  • 捕獲和分析JavaScript Error的方法

    捕獲和分析JavaScript Error的方法

    這篇文章主要介紹了如何捕獲和分析 JavaScript Error,感興趣的朋友可以參考下
    2014-03-03
  • JS實現(xiàn)手寫parseInt的方法示例

    JS實現(xiàn)手寫parseInt的方法示例

    這篇文章主要給大家介紹了JS實現(xiàn)手寫parseInt的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 原生js實現(xiàn)水平方向無縫滾動

    原生js實現(xiàn)水平方向無縫滾動

    這篇文章主要為大家詳細(xì)介紹了原生js實現(xiàn)水平方向無縫滾動的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 開發(fā)中常用的25個JavaScript單行代碼(小結(jié))

    開發(fā)中常用的25個JavaScript單行代碼(小結(jié))

    這篇文章主要介紹了開發(fā)中常用的25個JavaScript單行代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • 微信JS-SDK坐標(biāo)位置如何轉(zhuǎn)換為百度地圖坐標(biāo)

    微信JS-SDK坐標(biāo)位置如何轉(zhuǎn)換為百度地圖坐標(biāo)

    這篇文章主要介紹了微信JS-SDK坐標(biāo)位置如何轉(zhuǎn)換為百度地圖坐標(biāo) 的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • javascript開發(fā)隨筆二 動態(tài)加載js和文件

    javascript開發(fā)隨筆二 動態(tài)加載js和文件

    js無非就是script標(biāo)簽引入頁面,但當(dāng)項目越來越大的時候,單頁面引入N個js顯然不行,合并為單個文件減少了請求數(shù),但請求的文件體積卻很大
    2011-11-11
  • javaScript 頁面自動加載事件詳解

    javaScript 頁面自動加載事件詳解

    本篇文章主要是對javaScript頁面自動加載事件進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02

最新評論

富顺县| 时尚| 获嘉县| 石城县| 九龙县| 调兵山市| 蓬莱市| 宜昌市| 金川县| 黄梅县| 化州市| 漳平市| 商河县| 芜湖市| 彩票| 盐源县| 张家港市| 襄汾县| 赤水市| 望奎县| 恭城| 贵南县| 县级市| 玉环县| 镇康县| 高州市| 嘉义市| 比如县| 正安县| 时尚| 双流县| 桦川县| 拉孜县| 长治县| 中江县| 顺昌县| 昌宁县| 东乌珠穆沁旗| 普洱| 梅河口市| 茂名市|