由於同源策略的限制,Javascript存在跨域通訊的問題,典型的跨域問題有iframe與父級的通訊等。
幾個常規的解決方法:
(1) document.domain iframe;
(2) 動態建立script;
(3) iframe location.hash;
(4) flash。
這裡不細說這幾種方法,記錄的是HTML5的window.postMessage。
postMessage相容於IE8 、Firefox、Opera、Safari、Chrome。
需要兩個異域的伺服器來做測試,當然也可以用本地和線上伺服器作為兩個異域的伺服器。
假如使用phonegap開發,就可以將請求檔案安裝在客戶端,然後動態請求伺服器的資料處理,取得並顯示資料。這樣就可以用任意Web開發語言及方法來開發phonegap App所需的後台。
1. postMessage的用法
postMessage是HTML5為解決js跨域問題而引入的新的API,允許多個iframe/ window跨域通訊。
假設有結構如下:
"test"
iframe.html
"test">暫無訊息。
下面是test.html裡的Javascript程式碼(傳送資料):var win = document.getElementById("iframe").contentWindow;document.querySelector('form').onsubmit=function(e){
JavaScript Code
很簡單,相信一看就懂了。 e.data包含傳送過來的數據,e.origin指涉來源域。
然後iframe.html也給test.html發送回應的數據,test.html接收數據。程式碼雷同,就不貼程式碼了。
2. Ajax跨域請求
基於以上的跨域通信,只要將Ajax程式碼放在iframe.html裡的onmessage處理函數裡頭,將test.html用postMessage傳過來的資料作為參數傳送請求,再將傳回的資料用postMessage傳給test.html。這樣就實作了跨域的Ajax請求。其實是很簡單的東西。
貼個範例程式碼吧,但跟以上的程式碼無關。
次に、見苦しいデモを行います。
コードリクエストに興味がある場合は、開発者ツールを使用して確認してください。「zebo man」はデータベースから読み取られ、「my msg」はsendAndReceiveによって送信されるAjaxリクエストのパラメータです。 .html から test.php に変換され、test.php および iframeforAjax.html を通じて sendAndReceive.html に戻されます。
3. ヒント
postMessage を呼び出すには、iframe の contentWindow を取得する必要があります。
postMessage を正常に実行するには、iframe がロードされた後に呼び出す必要があります。 (かなり時間がかかりました)