js跨域

jsonp

原理:
JSONP 利用 <script>元素的這個(gè)開放策略,網(wǎng)頁可以得到從其他來源動(dòng)態(tài)產(chǎn)生的JSON數(shù)據(jù)片任,而這種使用模式就是所謂的 JSONP森爽。用JSONP抓到的數(shù)據(jù)并不是JSON,而是任意的JavaScript,用 JavaScript解釋器運(yùn)行而不是用JSON解析器解析鹿榜。

<script type="text/javascript">   
    var localHandler = function(data){
    alert('我是本地函數(shù),可以被跨域的remote.js文件調(diào)用锦爵,遠(yuǎn)程js帶來的數(shù)據(jù)是:' + data.result);    };    
</script>   
<script type="text/javascript" src="http://remoteserver.com/remote.js"></script>

遠(yuǎn)程的remote.js

localHandler({"result":"我是遠(yuǎn)程js帶來的數(shù)據(jù)"});

我本地請(qǐng)求

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
    // 得到航班信息查詢結(jié)果后的回調(diào)函數(shù)
    var flightHandler = function(data){
        alert('你查詢的航班結(jié)果是:票價(jià) ' + data.price + ' 元舱殿,' + '余票 ' + data.tickets + ' 張。');
    };
    // 提供jsonp服務(wù)的url地址(不管是什么類型的地址险掀,最終生成的返回值都是一段javascript代碼)
    var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";
    // 創(chuàng)建script標(biāo)簽沪袭,設(shè)置其屬性
    var script = document.createElement('script');
    script.setAttribute('src', url);
    // 把script標(biāo)簽加入head,此時(shí)調(diào)用開始
    document.getElementsByTagName('head')[0].appendChild(script); 
    </script>
</head>
<body>

</body>
</html>

請(qǐng)求flightResult.aspx獲取的數(shù)據(jù)

flightHandler({
    "code": "CA1998",
    "price": 1780,
    "tickets": 5
});

調(diào)用的url中傳遞了一個(gè)code參數(shù)樟氢,告訴服務(wù)器我要查的是CA1998次航班的信息冈绊,而callback參數(shù)則告訴服務(wù)器,我的本地回調(diào)函數(shù)叫做flightHandler埠啃,所以請(qǐng)把查詢結(jié)果傳入這個(gè)函數(shù)中進(jìn)行調(diào)用死宣。

劣勢(shì): 支持get 安全性不高 (可以通過動(dòng)態(tài)生成jsonp解決)

與ajax的區(qū)別
但ajax和jsonp其實(shí)本質(zhì)上是不同的東西。ajax的核心是通過XmlHttpRequest獲取非本頁內(nèi)容碴开,而jsonp的核心則是動(dòng)態(tài)添加<script>標(biāo)簽來調(diào)用服務(wù)器提供的js腳本毅该。

cors

document.domain+iframe(適用于主域名相同的情況)

在域名為http://server.example.com中的a.html

document.domain = 'example.com';
var $iframe = document.createElement('iframe');
$iframe.src = 'server.child.example.com/b.html';
$iframe.style.display = 'none';
document.body.appendChild($iframe);
$iframe.onload = function(){
    var doc = $iframe.contentDocument || $iframe.contentWindow.document;
    //在這里操作doc,也就是操作b.html
    $iframe.onload = null;
};

在域名為http://server.child.example.com中的b.html

document.domain = 'example.com'

這種形式方便歸方便叹螟,但也有其方便帶來的隱患

  • 安全性鹃骂,當(dāng)一個(gè)站點(diǎn)被攻擊后,另一個(gè)站點(diǎn)會(huì)引起安全漏洞罢绽。

  • 若頁面中引入多個(gè)iframe,要想操作所有iframe静盅,domain需要全部設(shè)置成一樣的良价。

HTML5中的postMessage

postMessage隸屬于html5寝殴,但是它支持IE8+和其他瀏覽器,可以實(shí)現(xiàn)同域傳遞明垢,也能實(shí)現(xiàn)跨域傳遞蚣常。它包括發(fā)送消息postMessage和接收消息message功能。

postMessage調(diào)用語法如下

otherWindow.postMessage(message, targetOrigin, [transfer]);

  • otherWindow : 其他窗口的一個(gè)引用痊银,比如iframe的contentWindow屬性抵蚊、執(zhí)行window.open返回的窗口對(duì)象、或者是命名過或數(shù)值索引的window.frames溯革。
  • message : 將要發(fā)送到其他 window的數(shù)據(jù)贞绳,類型為string或者object。
  • targetOrigin : 通過窗口的origin屬性來指定哪些窗口能接收到消息事件致稀,其值可以是字符串"*"(表示無限制)或者一個(gè)URI冈闭。
  • transfer (可選) : 一串和message 同時(shí)傳遞的 Transferable 對(duì)象。

接收消息message 的屬性有:

  • data :從其他 window 中傳遞過來的數(shù)據(jù)抖单。
  • origin :調(diào)用 postMessage 時(shí)消息發(fā)送方窗口的 origin 萎攒。
  • source :對(duì)發(fā)送消息的窗口對(duì)象的引用。

示例如下:域名http://127.0.0.1:9000頁面A通過iframe嵌入了http://127.0.0.1頁面B矛绘,接下來頁面A將通過postMessage對(duì)頁面B進(jìn)行數(shù)據(jù)傳遞耍休,頁面B將通過message屬性接收頁面A的數(shù)據(jù)

頁面A發(fā)送消息代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>頁面A</title>
</head>
<body>
    <h1>hello jsonp</h1>
    <iframe src="http://127.0.0.1/b.html" id="iframe"></iframe>
</body>
</html>
<script>
window.onload = function() {  
    var $iframe = document.getElementById('iframe');  
    var targetOrigin = "http://127.0.0.1";  
    $iframe.contentWindow.postMessage('postMessage發(fā)送消息', targetOrigin);  
}; 
</script>

頁面B接收消息代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>頁面B</title>
</head>
<body>
    <h1>hello jsonp</h1>
</body>
</html>
<script>
var onmessage = function (event) {
  var data = event.data;    //消息
  var origin = event.origin; //消息來源地址
  var source = event.source; //源Window對(duì)象
  if(origin === "http://127.0.0.1:9000"){
    console.log(data, origin, source);
  }
};
// 事件兼容簡(jiǎn)單處理
if (window.addEventListener) {
  window.addEventListener('message', onmessage, false);
}
else if (window.attachEvent) {
  window.attachEvent('onmessage', onmessage);
}
else {
  window.onmessage = onmessage;
}
</script>

運(yùn)行結(jié)果如下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市货矮,隨后出現(xiàn)的幾起案子羹应,更是在濱河造成了極大的恐慌,老刑警劉巖次屠,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件园匹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡劫灶,警方通過查閱死者的電腦和手機(jī)裸违,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來本昏,“玉大人供汛,你說我怎么就攤上這事∮磕拢” “怎么了怔昨?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宿稀。 經(jīng)常有香客問我趁舀,道長(zhǎng),這世上最難降的妖魔是什么祝沸? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任矮烹,我火速辦了婚禮越庇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奉狈。我一直安慰自己卤唉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布仁期。 她就那樣靜靜地躺著桑驱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跛蛋。 梳的紋絲不亂的頭發(fā)上熬的,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音问芬,去河邊找鬼悦析。 笑死,一個(gè)胖子當(dāng)著我的面吹牛此衅,可吹牛的內(nèi)容都是我干的强戴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼挡鞍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼骑歹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起墨微,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤道媚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后翘县,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體最域,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年锈麸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镀脂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忘伞,死狀恐怖薄翅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氓奈,我是刑警寧澤翘魄,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站舀奶,受9級(jí)特大地震影響暑竟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伪节,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一光羞、第九天 我趴在偏房一處隱蔽的房頂上張望绩鸣。 院中可真熱鬧怀大,春花似錦纱兑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蓖康,卻和暖如春铐炫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒜焊。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工倒信, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泳梆。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓鳖悠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親优妙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乘综,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • Section1、為什么要跨域套硼? 自古以來(1995年起)卡辰,為了用戶的信息安全,瀏覽器就引入了同源策略邪意。那么同源策...
    qhaobaba閱讀 376評(píng)論 0 0
  • Section1九妈、為什么要跨域? 自古以來(1995年起)雾鬼,為了用戶的信息安全萌朱,瀏覽器就引入了同源策略。那么同源策...
    不去解釋閱讀 547評(píng)論 0 0
  • 0. 前言 說到AJAX就會(huì)不可避免的面臨兩個(gè)問題呆贿。 AJAX以何種格式來交換數(shù)據(jù)嚷兔? 第二個(gè)是跨域的需求如何解決?...
    公子七閱讀 23,581評(píng)論 7 67
  • JavaScript是一種在Web開發(fā)中經(jīng)常使用的前端動(dòng)態(tài)腳本技術(shù)做入。在JavaScript中冒晰,有一個(gè)很重要的...
    西瓜w閱讀 1,748評(píng)論 0 1
  • 感恩方姐組織日行一善群到養(yǎng)老院送溫暖的活動(dòng)【箍椋看到那些慈善的老人雖然遠(yuǎn)離家人壶运,但是在敬老院都生活得很好,身體也很健康...
    武丹yoyo閱讀 171評(píng)論 0 1