關於javascript跨域的解決方法

關於javascript跨域的解決方法

由於在自己這麼多年項目開發中對跨域這方面應用的很少,近幾次面試都涉及到了這個跨域的問題。因此,這幾天對跨域深深的研究了一下,希望以後如果能應用到的話可以作爲自己的參考。

什麼是跨域?

在javascript開發中,出於安全性的考慮,javacript禁止對不同域名,端口服務器進行訪問,也就是說只能訪問同一個域名,而且也是同一個端口號上的數據才能進行自由訪問,其他的就不能直接訪問。也就是我們說的**同源策略**,但是在日常應用中,我們有這麼幾個方法可以替我們解決這個問題。接下來我們就簡單的介紹一個。

document.domain+iframe

使用document.domain+iframe可以解決一些跨域的問題,但是他們聯合起來只能解決主域相同二級域名不同的情況,如果主域不同這個是不起作用的。具體做法就是在兩個不同的域名的html中加入document.domain這個對象,並對其賦值,在賦值名的html下創建iframe標籤,然後我們操作iframe裏的頁面的contentDocument即可。
document.domain = 'www.foo.com';
var iframe1 = document.createElement('iframe');
iframe1.src = 'http://script.foo.com/hoo.html';
iframe1.display = 'none;//設置隱藏就不會影響頁面的結構
document.appendChild(iframe1);
    iframe1.onload = function(){
    var content = iframe1.contentDocument ||
iframe1.contentWindow.document;
        //通過content就可以訪問iframe1上的標籤額內容了。
    console.log(document.getElementById('div#nav').childNodes[2].innerHTML);
};

postMessage

在HTML5最新特性中,我們有一個新功能就是跨文檔消息傳輸**cross document messaging**.postMessage()方法允許來自不同源的腳本採用異步的方式進行有限的通信,可以實現跨文檔,多窗口,跨域消息傳遞。
postMessage(data,origin);//接受兩個參數
// data:要傳遞的數據,該參數值可以是javascript中的任意類型數據或者是可以複製的對象。由於某些瀏覽器只能藉此處理字符串參數。所以我們在傳遞參數的時候使用JSON.stringify()函數進行序列化。
//origi:字符串參數,定義目標窗口的源,即協議(http?)+主機+端口號。後面的url會被忽略,因爲主要是前面這部分。postMessage()函數只會將message傳遞給指定的目標窗口。
當我們將這個參數設置爲“*”時,就可以傳遞給任意的窗口,如果要指定和當前窗口同源的話,可以設置爲'/'.

例:
在http://foo.com/通過postMessage()方法向跨域的http://goo.com/傳遞消息。
//在foo.com下面應該這樣寫:

window.frames[0].postMessage('helloWorld','http://goo.com/');

//在http://goo.com/接收消息,通過監聽window的message事件就可以獲取到跨域的信息了。

window.addEventListener('message',function(e){
    if(e.source != window.parent){
        return;
    }else{
        var message = container.innerHTML;
        window.parent.postMessage(message,'*');
    }
});

//在這個e參數上面有幾個重要的屬性:
// data:從跨域傳遞過來的消息。
// source:發送這個消息的窗口對象
// origin:發送消息窗口的源(包括:協議+主機+端口號)

其他的一些跨域方法如:動態創建script標籤,location.hash,window.name等方法。在這裏就不一一贅述了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章