在 http://www.cnblogs.com/zhuzhenwei918/p/6759459.html 這篇文章中,我提到了幾種跨域的方式,這里主要講解使用window.name實現跨域。
跨域就是說必須同協議、域名、端口號,我們才能獲取其內容,對其進行訪問。
window.name這個屬性不是一個簡單的全局屬性 --- 只要在一個window下,無論url怎么變化,只要設置好了window.name,那么后續就一直都不會改變,同理,在iframe中,即使url在變化,iframe中的window.name也是一個固定的值,利用這個,我們就可以實現跨域了。
下面是localhost:8088/test2.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test2</title> </head> <body> <h2>test2頁面</h2> <script> var person = { name: 'wayne zhu', age: 22, school: 'xjtu' } window.name = JSON.stringify(person) </script> </body> </html>
即我們希望吧test2.html中的數據傳遞出去,到localhost:8081/test1.html中去。
下面是localhost:8081/test1.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test1</title> </head> <body> <h2>test1頁面</h2> <iframe src="http://localhost:8088/test2.html" frameborder="1"></iframe> <script> var ifr = document.querySelector('iframe') ifr.style.display = 'none' var flag = 0; ifr.onload = function () { if (flag == 1) { console.log('跨域獲取數據', ifr.contentWindow.name); ifr.contentWindow.close(); } else if (flag == 0) { flag = 1; ifr.contentWindow.location = 'http://localhost:8081/proxy.html'; } } </script> </body> </html>
這里的意圖很明確,就是使用iframe將test2.html加載過來,因為只是為了實現跨域,所以將之隱藏,但是,這時已經完成了最重要的一步,就是將iframe中window.name已經成功設置,但是現在還獲取不了,因為是跨域的,所以,我們可以把src設置為當前域的proxy.html。
另外,這里之所以要設置flag,是因為每當改變location的時候,就會重新來一次onload,所以我們希望獲取到數據之后,就直接close(),故采用此種方法。
這個proxy.html內容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>proxy</title> </head> <body> <p>這是proxy頁面</p> </body> </html>
是的,什么都沒有,當然,我們也可以把src就替換成test1.html,但是這樣的壞處很明顯,就是需要把test1.html中的數據加載一遍,這不是我們所希望的。
OK! 這樣,就成功完成了跨域!
代碼: https://github.com/zzw918/cross-origin
如我們希望localhost:8081/test1.html可以訪問到localhost:8088/test2.html中的數據,正常來說,由於跨域,這一定是不可能的,一般的實現思路可以是這樣的。