在客戶端編程語言中如javascript,同源策略規定跨域之間的腳本是隔離的,一個域的腳本不能訪問和操作另外一個域的絕大部分屬性和方法。只有當兩個域具有相同的協議,相同的主機,相同的端口時,我們就認定他們是相同的域。可是在實際開發中我們經常需要獲取其他域的資源,這個時候各種不同的跨域資源方式就各顯神通了,今天主要來總結一下工作中常用的幾種跨域方式,以備查詢。
1.window.name
window 對象的name屬性是一個很特別的屬性,當在 frame 中加載新頁面時,name 的屬性值依舊保持不變。那么我們可以在頁面 A中用iframe加載其他域的頁面B,而頁面B中用JavaScript把需要傳遞的數據賦值給window.name,iframe加載完成之后,此時 name 屬性值可被獲取到,以訪問 Web 服務發送的信息。但 name 屬性僅對相同域名的 frame 可訪問。這意味著為了訪問 name 屬性,當遠程 Web 服務頁面被加載后,必須導航 frame 回到原始域。即頁面A修改iframe的地址,將其變成同域的一個地址,然后就可以讀出window.name的值了。一旦 name 屬性獲得,銷毀 frame 。這個方式非常適合單向的數據請求,而且協議簡單、安全。
頁面B(www.jesse.com/data.html)代碼如下:
<script type="text/javascript">window.name = 'I was there!';// 這里是要傳輸的數據,大小一般為2M,IE和firefox下可以大至32M左右// 數據格式可以自定義,如json、字符串</script>
頁面A(www.jack.com/index.html)代碼如下:
<script type="text/javascript">var state = 0, iframe = document.createElement('iframe'), loadfn = function() { if (state === 1) { var data = iframe.contentWindow.name; // 讀取數據 console.log(data); //彈出'I wasthere!' (function(){ //獲取數據以后銷毀這個iframe。 iframe.contentWindow.document.write(''); iframe.contentWindow.close(); document.body.removeChild(iframe); })(); } else if (state === 0) { state = 1; // 設置的代理頁面使其回原始域 iframe.contentWindow.location = "http://www.jack.com/proxy.html"; } };iframe.src = 'http://www.jesse.com/data.html';if (iframe.attachEvent) { iframe.attachEvent('onload', loadfn);} else { iframe.onload = loadfn;}document.body.appendChild(iframe);</script>2.具備src的標簽
雖然瀏覽器默認禁止了跨域訪問,但并不禁止在頁面中用標簽的src屬性引用其他域的文件。根據這一點,可以方便地通過創建具有src屬性的節點方法來實現完全跨域的通信。使用這種原理的跨域方式有以下幾種:
動態創建script
例如我要從域A的頁面pageA加載域B的數據,那么在域B的頁面pageB中我以JavaScript的形式聲明pageA需要的數據,然后在 pageA中用script標簽把pageB加載進來,那么pageB中的腳本就會得以執行。
新聞熱點
疑難解答
圖片精選