摘要:在支持這個(gè)方式的瀏覽器里,的寫法和不跨域的寫法一模一樣,只要服務(wù)器需要設(shè)置這種方式適用于主域相同,子域不同,比如和假如這兩個(gè)域名下各有和在這里操作里的元素?cái)?shù)據(jù)注意需要設(shè)置成自身或更高一級(jí)的父域,且主域必須相同。
打個(gè)招聘廣告: 杭州 阿里巴巴B2B 招前端(想去西溪的也可幫推薦),比較缺人,機(jī)會(huì)多多!廣告位長(zhǎng)期有效,有興趣簡(jiǎn)歷我郵箱:854936875@qq.com
此文章學(xué)習(xí)借鑒了一些其他前端同學(xué)的文章,自己做了個(gè)實(shí)踐總結(jié)
以下的例子包含的文件均為為 http://www.a.com/a.html 、http://www.a.com/c.html 與 http://www.b.com/b.html,要做的都是從a.html獲取b.html里的數(shù)據(jù)
1.JSONPjsonp是利用script標(biāo)簽沒有跨域限制的特性,通過在src的url的參數(shù)上附加回調(diào)函數(shù)名字,然后服務(wù)器接收回調(diào)函數(shù)名字并返回一個(gè)包含數(shù)據(jù)的回調(diào)函數(shù)
function doSomething(data) { // 對(duì)data處理 } var script = document.createElement("script"); script.src = "http://www.b.com/b.html?callback=doSomething"; document.body.appendChild(script); // 1.生成一個(gè)script標(biāo)簽,將其append在body上,向服務(wù)器發(fā)出請(qǐng)求 // 2.服務(wù)器根據(jù) callback 這個(gè)參數(shù)生成一個(gè)包含數(shù)據(jù)的函數(shù) doSomething({"a", "1"}) // 3.頁面事先已聲明doSomething函數(shù),此時(shí)執(zhí)行 doSomething(data) 這個(gè)函數(shù),獲得數(shù)據(jù)2.HTML5的postMessage
假設(shè)在a.html里嵌套個(gè),在這兩個(gè)頁面里互相通信
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 + iframewindow.name的原理是利用同一個(gè)窗口在不同的頁面共用一個(gè)window.name,這個(gè)需要在a.com下建立一個(gè)代理文件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里建一個(gè)引用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(這個(gè)例子是傳到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è)置個(gè)定時(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ī)定的一種跨域方式。在支持這個(gè)方式的瀏覽器里,javascript的寫法和不跨域的ajax寫法一模一樣,只要服務(wù)器需要設(shè)置Access-Control-Allow-Origin: *
6.document.domain這種方式適用于主域相同,子域不同,比如http://www.a.com和http://b.a.com
假如這兩個(gè)域名下各有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里的元素?cái)?shù)據(jù) }
b.html
document.domain = "a.com";
注意:document.domain需要設(shè)置成自身或更高一級(jí)的父域,且主域必須相同。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86082.html
摘要:比如域的頁面通過嵌入了一個(gè)域的頁面,可以通過以下方法實(shí)現(xiàn)和的通信通過跨域以上幾種都是雙向通信的,即兩個(gè),頁面與或是頁面與頁面之間的,下面說幾種單項(xiàng)跨域的一般用來獲取數(shù)據(jù),因?yàn)橥ㄟ^標(biāo)簽引入的是不受同源策略的限制的。 跨域整理@(前端筆記) 跨域 只要協(xié)議、域名、端口有任何一個(gè)不同,都被當(dāng)作是不同的域。由于瀏覽器的同源策略,其限制之一是不能通過ajax的方法情趣請(qǐng)求不同源的文檔。第二個(gè)限制...
摘要:例外當(dāng)涉及到同源策略時(shí),有兩個(gè)主要的例外授信范圍兩個(gè)相互之間高度互信的域名,如公司域名,不遵守同源策略的限制。端口未將端口號(hào)加入到同源策略的組成部分之中,因此和屬于同源并且不受任何限制。 原文鏈接:http://www.devsai.com/2016/11/24/talk-CORS/ 同源策略(same origin policy) 1995年,同源政策由 Netscape 公司引入瀏...
摘要:什么是跨域要明白什么是跨域之前,首先要明白什么是同源策略同源策略就是用來限制從一個(gè)源加載的文檔或腳本與來自另一個(gè)源的資源進(jìn)行交互。最后,解決跨域問題還有一個(gè)更通用更強(qiáng)大的方法,我單獨(dú)把它拿出來總結(jié)了一篇文章跨域問題的根本解決方案。 什么是跨域? 要明白什么是跨域之前,首先要明白什么是同源策略? 同源策略就是用來限制從一個(gè)源加載的文檔或腳本與來自另一個(gè)源的資源進(jìn)行交互。那怎樣判斷是否是同...
摘要:請(qǐng)求服務(wù)器數(shù)據(jù)并規(guī)定回調(diào)函數(shù)為上面代碼通過動(dòng)態(tài)添加元素,向服務(wù)器發(fā)出請(qǐng)求。另外假設(shè)向服務(wù)發(fā)送的請(qǐng)求是這樣的在這種情況下,是表示請(qǐng)求的請(qǐng)求參數(shù),而是應(yīng)用程序的回調(diào)函數(shù)的名稱。清單調(diào)用回調(diào)服務(wù)注意,我們使用作為回調(diào)函數(shù)名,而非真實(shí)的函數(shù)名。 同源策略 同源策略(Same origin policy),它是由Netscape提出的一個(gè)著名的安全策略。現(xiàn)在所有支持JavaScript的瀏覽器都...
什么是跨域 首先,我們需要了解一下一個(gè)URL是怎么組成的: // 協(xié)議 + 域名(子域名 + 主域名) + 端口號(hào) + 資源地址 http: + // + www.baidu.com + :8080/ 只要協(xié)議,子域名,主域名,端口號(hào)這四項(xiàng)組成部分中有一項(xiàng)不同,就可以認(rèn)為是不同的域,不同的域之間互相訪問資源,就被稱之為跨域。 隨著前后端分離開發(fā)的越來越普及,會(huì)經(jīng)常遇到跨域的問題,當(dāng)我們?cè)跒g覽...
閱讀 3936·2021-11-16 11:50
閱讀 934·2021-11-11 16:55
閱讀 3662·2021-10-26 09:51
閱讀 866·2021-09-22 15:03
閱讀 3422·2019-08-30 15:54
閱讀 3265·2019-08-30 15:54
閱讀 2476·2019-08-30 14:04
閱讀 922·2019-08-30 13:53