這幾天大爺遇到了一個大瓶頸
搞了好多天
看了一堆的文章真的是搞的我霧煞煞
終於找到比較簡單的方法來解決
以下就來介紹一下
順便做個記錄吧
這個瓶頸是關於iframe跨不同網域的問題
在HTML5有提供一個 window.postMessage 的方法
不過這個方法只支援IE8以上
所以IE8以下的瀏覽器要達到這個技巧就得繞繞圈子了
一般網路上最常見的解決方式是透過 document.location.hash (這個是用來設定當前位置的url中的參數(#號部分))
透過這個小技巧…就能讓主頁面和iframe子頁面互相傳遞資料
但有些缺點…就是會有長度上的限制
而且瀏覽器的上一頁、下一頁的機制會被破壞
如果要傳遞比較大的資料就會透過 window.name 的技巧來實作了
(請參考 http://www.wowbox.com.tw/blog/article.asp?id=3031 )
理論上呢…透過 document.location.hash 有兩種方式
第一種:透過在主網域裡再新增一個proxy.html的中間者來做兩邊互相溝通的橋樑
(可參考 http://ued.sohu.com/article/518 )
第二種:
若是不想透過中間者的話…那兩邊就得不斷的互相監聽對方是否有更改 document.location.hash 內容
然後再根據裡面的內容來做適當的回應
至於監聽的實作可以透過更改iframe大小來監聽resize這個事件
(可參考 http://adamlu.com/?p=325 )
大致上的理論就是這樣
當然啦…知道理論之後要實作…其實也沒太大的困難
可是如果有人願意提供那就更好啦…哈
沒錯…就是有好心人替我們解決了這個煩人的問題
jQuery postMessage: Cross-domain scripting goodness
這是一支用來實作iframe跨網域的jquery plugin
程式會先判斷瀏覽器是否有支援window.postMessage 的方法
沒有就改用上面介紹的document.location.hash方式。
官網:http://benalman.com/projects/jquery-postmessage-plugin/
- Release v0.5
- Tested with jQuery 1.3.2 in Internet Explorer 6-8, Firefox 3, Safari 3-4, Chrome, Opera 9.
- Download Source, Minified (0.9kb)
- Follow the project on GitHub project page or report a bug!
- View Full Documentation
- Examples: Iframe resizing
使用的方式是主頁面和子iframe頁面都需先引入jquery.ba-postmessage.js 原始檔
下面就是官方網站所提供的簡單使用方式…兩邊都可以互相傳遞資料給對方
主頁面接收端程式
1.
$.receiveMessage(
2.
function
(e){
3.
alert( e.data ); //接收的訊息
4.
},
5.
'http://rj3.net' //只允許從這個域名傳遞來的訊邊
6.
);
子頁面iframe傳送端程式
1.
$.postMessage(
2.
'hello world'
, //傳遞出去的訊息內容
3.
'http://benalman.com/test.html'
, //接收端的域名
4.
parent //負責溝通的物件,預設為parent
5.
);
官網提供的技術文件:http://benalman.com/code/projects/jquery-postmessage/docs/files/jquery-ba-postmessage-js.html
這邊是官網提供的更完整的範例:http://benalman.com/code/projects/jquery-postmessage/docs/files/jquery-ba-postmessage-js.html