演示三種跨域的解決方式

JSONP

// 前端程序
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>news</title>
<style>
  .container{
    width: 900px;
    margin: 0 auto;
  }
</style>
</head>
<body>
  <div class="container">
    <ul class="news">
      <li>第11日前瞻:中國(guó)沖擊4金 博爾特再戰(zhàn)</li>
      <li>男雙力爭(zhēng)會(huì)師決賽 </li> 
      <li>女排將死磕巴西赤惊!</li>
    </ul>
    <button class="change">換一組</button>
  </div>
  
<script>
  
  $('.change').addEventListener('click', function(){
    var script = document.createElement('script');
    // 第1步:創(chuàng)建一個(gè) script 標(biāo)簽
    script.src = 'http://127.0.0.1/getNews?callback=appendHtml';
    // 第2步:將 script 的 src 屬性改為目標(biāo)域的地址 url,并在 url 中帶好參數(shù)妻熊,方便后端直接將返回?cái)?shù)據(jù)定義成要執(zhí)行的 js 函數(shù)的形式
    document.head.appendChild(script);
    // 第3步:將創(chuàng)建并修改好的 script 標(biāo)簽加到頁(yè)面 DOM 中
    document.head.removeChild(script);
    // 第4步:script 標(biāo)簽使用完畢灶轰,可以從文檔中移除
  })

  function appendHtml(news){
    var html = '';
    for( var i=0; i<news.length; i++){
      html += '<li>' + news[i] + '</li>';
    }
    console.log(html);
    $('.news').innerHTML = html;
  }


  function $(id){
    return document.querySelector(id);
  }
</script>
</html>
// 后端程序羡洁,使用 server-mock 啟動(dòng)

app.get('/getNews', function(req, res){
    var news = [
        "第11日前瞻:中國(guó)沖擊4金 博爾特再戰(zhàn)200米羽球",
        "正直播柴飚/洪煒出戰(zhàn) 男雙力爭(zhēng)會(huì)師決賽",
        "女排將死磕巴西其垄!郎平安排男陪練模仿對(duì)方核心",
        "沒(méi)有中國(guó)選手和巨星的110米欄 我們還看嗎苛蒲?",
        "中英上演奧運(yùn)金牌大戰(zhàn)",
        "博彩賠率挺中國(guó)奪回第二紐約時(shí)報(bào):中國(guó)因?qū)κ址幎鴣G失的獎(jiǎng)牌最多",
        "最“出柜”奧運(yùn)?同性之愛(ài)閃耀里約",
        "下跪拜謝與洪荒之力一樣 都是真情流露"
    ]
    var data = [];
    for(var i=0; i<3; i++){
        var index = parseInt(Math.random()*news.length);
        data.push(news[index]);
        news.splice(index, 1);
    }


    var cb = req.query.callback;
    if(cb){
        res.send(cb + '('+ JSON.stringify(data) + ')');
    }else{
        res.send(data);
    }
    // 根據(jù) url 參數(shù)捉捅,返回?cái)?shù)據(jù)形式直接是 function() 的形式撤防,在頁(yè)面中直接就是要執(zhí)行的 JS 函數(shù)代碼
})

核心是

  $('.change').addEventListener('click', function(){
    var script = document.createElement('script');
    // 第1步:創(chuàng)建一個(gè) script 標(biāo)簽
    script.src = 'http://127.0.0.1/getNews?callback=appendHtml';
    // 第2步:將 script 的 src 屬性改為目標(biāo)域的地址 url,并在 url 中帶好參數(shù)棒口,方便后端直接將返回?cái)?shù)據(jù)定義成要執(zhí)行的 js 函數(shù)的形式
    document.head.appendChild(script);
    // 第3步:將創(chuàng)建并修改好的 script 標(biāo)簽加到頁(yè)面 DOM 中
    document.head.removeChild(script);
    // 第4步:script 標(biāo)簽使用完畢寄月,可以從文檔中移除
  })
    var cb = req.query.callback;
    if(cb){
        res.send(cb + '('+ JSON.stringify(data) + ')');
    }else{
        res.send(data);
    }
    // 根據(jù) url 參數(shù),返回?cái)?shù)據(jù)形式直接是 function() 的形式无牵,在頁(yè)面中直接就是要執(zhí)行的 JS 函數(shù)代碼

CORS

// 前端程序
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>news</title>
<style>
  .container{
    width: 900px;
    margin: 0 auto;
  }
</style>
</head>
<body>
  <div class="container">
    <ul class="news">
      <li>第11日前瞻:中國(guó)沖擊4金 博爾特再戰(zhàn)</li>
      <li>男雙力爭(zhēng)會(huì)師決賽 </li> 
      <li>女排將死磕巴西漾肮!</li>
    </ul>
    <button class="change">換一組</button>
  </div>
  
<script>
  $('.change').addEventListener('click', function(){

    var xhr = new XMLHttpRequest();
    xhr.open('get', 'http://b.jrg.com:8080/getNews', true);
    xhr.send();
    xhr.onreadystatechange = function(){
      if(xhr.readyState === 4 && xhr.status === 200){
        appendHtml( JSON.parse(xhr.responseText) )
      }
    }
  })

  function appendHtml(news){
    var html = '';
    for( var i=0; i<news.length; i++){
      html += '<li>' + news[i] + '</li>';
    }
    console.log(html);
    $('.news').innerHTML = html;
  }


  function $(id){
    return document.querySelector(id);
  }
</script>
</html>
// 后端程序
app.get('/getNews', function(req, res){

   var news = [
       "第11日前瞻:中國(guó)沖擊4金 博爾特再戰(zhàn)200米羽球",
       "正直播柴飚/洪煒出戰(zhàn) 男雙力爭(zhēng)會(huì)師決賽",
       "女排將死磕巴西!郎平安排男陪練模仿對(duì)方核心",
       "沒(méi)有中國(guó)選手和巨星的110米欄 我們還看嗎茎毁?",
       "中英上演奧運(yùn)金牌大戰(zhàn)",
       "博彩賠率挺中國(guó)奪回第二紐約時(shí)報(bào):中國(guó)因?qū)κ址幎鴣G失的獎(jiǎng)牌最多",
       "最“出柜”奧運(yùn)克懊?同性之愛(ài)閃耀里約",
       "下跪拜謝與洪荒之力一樣 都是真情流露"
   ]
   var data = [];
   for(var i=0; i<3; i++){
       var index = parseInt(Math.random()*news.length);
       data.push(news[index]);
       news.splice(index, 1);
   }
 
   // CORS 方法的關(guān)鍵在后端這里,后端這里對(duì)于允許跨域訪問(wèn)自身 JS 接口的地址專(zhuān)門(mén)設(shè)置了返回響應(yīng)的頭部七蜘,如下述這兩行所示
   res.header("Access-Control-Allow-Origin", "http://a.jrg.com:8080"); 
   //res.header("Access-Control-Allow-Origin", "*"); 
   // 第一行允許專(zhuān)門(mén)的地址跨域訪問(wèn)自身谭溉,第二行允許所有地址跨域訪問(wèn)自身
 
   res.send(data);
})

核心是

    // CORS 方法的關(guān)鍵在后端這里,后端這里對(duì)于允許跨域訪問(wèn)自身 JS 接口的地址專(zhuān)門(mén)設(shè)置了返回響應(yīng)的頭部橡卤,如下述這兩行所示
    res.header("Access-Control-Allow-Origin", "http://a.jrg.com:8080"); 
    //res.header("Access-Control-Allow-Origin", "*"); 
    // 第一行允許專(zhuān)門(mén)的地址跨域訪問(wèn)自身扮念,第二行允許所有地址跨域訪問(wèn)自身
  

降域

<html>
<style>
  .ct{width: 910px;margin: auto;}
  .main{
    float: left;
    width: 450px;
    height: 300px;
    border: 1px solid #ccc;
  }
  .main input{
    margin: 20px;
    width: 200px;
  }
  .iframe{
    float: right;
  }

  iframe{
    width: 450px;
    height: 300px;
    border: 1px dashed #ccc;
  }
</style>

<div class="ct">
  <h1>使用降域?qū)崿F(xiàn)跨域</h1>
  <div class="main">
    <input type="text" placeholder="http://a.jrg.com:8080/a.html">
  </div>

  <iframe src="http://b.jrg.com:8080/b.html" frameborder="0" ></iframe>
</div>

<script>
//URL: http://a.jrg.com:8080/a.html

document.querySelector('.main input').addEventListener('input', function(){
  console.log(this.value);
  window.frames[0].document.querySelector('input').value = this.value;
})

document.domain = "jrg.com"
</script>
</html>
<html>
<style>
    html,body{
        margin: 0;
    }
    input{
        margin: 20px;
        width: 200px;
    }
</style>

  <input id="input" type="text"  placeholder="http://b.jrg.com:8080/b.html">

<script>
// URL: http://b.jrg.com:8080/b.html
 
document.querySelector('#input').addEventListener('input', function() {
    window.parent.document.querySelector('input').value = this.value;
})

document.domain = 'jrg.com';
</script>
</html>

瀏覽器中不同域的框架也是不能通過(guò)js進(jìn)行交互的,但是不同框架之間可以獲取到window對(duì)象碧库,但卻無(wú)法獲取到相應(yīng)的屬性和方法柜与。

例如 a.baidu.com 域下的一個(gè) html 文檔里有一個(gè)在其他域下(b.baidu.com)的 iframe 框架,在a.baidu.com 中并不能訪問(wèn)到 b.baidu.com 里的數(shù)據(jù)嵌灰;

但可以獲取到 b.baidu.com 中的 window 對(duì)象弄匕,但是這時(shí) window 的屬性和方法并不可用,兩個(gè)文件中使用 document.domain('baidu.com')方法 把域名都降到baidu.com沽瞭;

這樣就可以在 a.baidu.com 中使用 iframe 里面的 window 的所有屬性和方法了迁匠,通過(guò)window.frames[0] 獲取到 iframe 框架,但是這時(shí)再通過(guò)window.frames[0].document.querySelector(element) 獲取到 iframe 里的 element 元素驹溃。

在b.baidu.com 中通過(guò)window.parent.document.querySelector(element) 獲取到html里的元素城丧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吠架,隨后出現(xiàn)的幾起案子芙贫,更是在濱河造成了極大的恐慌,老刑警劉巖傍药,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磺平,死亡現(xiàn)場(chǎng)離奇詭異魂仍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拣挪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)擦酌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人菠劝,你說(shuō)我怎么就攤上這事赊舶。” “怎么了赶诊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵笼平,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我舔痪,道長(zhǎng)寓调,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任锄码,我火速辦了婚禮夺英,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滋捶。我一直安慰自己痛悯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布重窟。 她就那樣靜靜地躺著载萌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亲族。 梳的紋絲不亂的頭發(fā)上炒考,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天可缚,我揣著相機(jī)與錄音霎迫,去河邊找鬼。 笑死帘靡,一個(gè)胖子當(dāng)著我的面吹牛知给,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播描姚,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涩赢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了轩勘?” 一聲冷哼從身側(cè)響起筒扒,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绊寻,沒(méi)想到半個(gè)月后花墩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體悬秉,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年冰蘑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了和泌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祠肥,死狀恐怖武氓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仇箱,我是刑警寧澤县恕,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站剂桥,受9級(jí)特大地震影響弱睦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渊额,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一况木、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旬迹,春花似錦火惊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至椿猎,卻和暖如春惶岭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犯眠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工按灶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筐咧。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓鸯旁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親量蕊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铺罢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 瀏覽器同源策略 瀏覽器出于安全考慮,默認(rèn)情況下残炮,只允許在本域接口下進(jìn)行數(shù)據(jù)交互韭赘。這是瀏覽器的一種安全保護(hù)機(jī)制。主要...
    sutingy閱讀 374評(píng)論 0 0
  • 1. 什么是跨域势就? 跨域一詞從字面意思看泉瞻,就是跨域名嘛楷怒,但實(shí)際上跨域的范圍絕對(duì)不止那么狹隘。具體概念如下:只要協(xié)議...
    他在發(fā)呆閱讀 822評(píng)論 0 0
  • 1. 什么是跨域瓦灶? 跨域一詞從字面意思看鸠删,就是跨域名嘛,但實(shí)際上跨域的范圍絕對(duì)不止那么狹隘贼陶。具體概念如下:只要協(xié)議...
    w_zhuan閱讀 515評(píng)論 0 0
  • 跨域問(wèn)題產(chǎn)生的原理是指通過(guò)js在不同的域之間進(jìn)行數(shù)據(jù)傳輸或通信刃泡,比如用ajax向一個(gè)不同的域請(qǐng)求數(shù)據(jù),或者通過(guò)js...
    往復(fù)隨安_cc75閱讀 517評(píng)論 0 1
  • 來(lái)吧碉怔,少年烘贴,今天還能看文章學(xué)習(xí)的,一多半都是單身貴族撮胧,看朋友圈還會(huì)被虐桨踪,不如學(xué)習(xí),上街還會(huì)被虐芹啥,不如學(xué)習(xí)锻离,痛并快樂(lè)...
    范小飯_閱讀 7,946評(píng)論 3 24