2014年5月12日 星期一

HTML5 使用postMessage在不同網頁之間傳送圖片

HTML5 的 postMessage 能在不同網頁中傳送資料,也能跨網域傳送資料。
之前測試了傳送文字訊息(HTML5 使用postMessage在不同網頁之間傳送文字訊息),
現在下面的範例,則是測試傳送圖片資料。
之前傳送給 window.open 開啟的頁面,現在改測試傳給 iframe 開啟的頁面。

註:
此範例在 chrome、IE11 測試正常,但在 Firefox 29.0.1 會出現 DataCloneError: The object could not be cloned. 錯誤。
但若改成使用 window.open 開啟接收頁面,且不跨網域,Firefox 也可正常運作。


傳送圖片頁面 (http://demo.cinc.biz/html5-postmessage/img.html)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>HTML5 使用postMessage在不同網頁之間傳送文字訊息(傳送頁面)</title>
        <style>
        </style>
    </head>
    <body>
        HTML5 使用postMessage在不同網頁之間傳送圖片(傳送頁面)<br>
        測試範例:<br>
        1.選擇圖片:<input id="pic_file"  type="file" onchange="showPic()"/><br>
           <img id="myimg" src="" width="300"/><br>
        2.<button onclick="sendImg()">傳送圖片到 iframe 頁面</button>
        
        <br><br>
        <iframe id="myiframe" src="http://demo2.cinc.biz/html5-postmessage/img-new.html" width="500" height="300"></iframe>
        
        <script>
            window.URL = window.URL || window.webkitURL;
        
            /* 傳送圖片給 Iframe */
            function sendImg() {
                var frame_win = document.getElementById("myiframe").contentWindow;
                var img = document.getElementById("pic_file").files[0];
                frame_win.postMessage(img, "http://demo2.cinc.biz");//表示要送給demo2.example.com網域
            }
            
            /* 圖片預覽 */
            function showPic() {
                var img = document.getElementById("pic_file").files[0];   
                if (img) {
                    var img_url = window.URL.createObjectURL(new Blob([img]));
                    document.getElementById('myimg').src = img_url;
                }
            }
        </script>
    </body>
</html>

接收圖片頁面 (http://demo2.cinc.biz/html5-postmessage/img-new.html)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>HTML5 使用postMessage在不同網頁之間傳送圖片(接收頁面)</title>
        <style>
        </style>
        <script>
            window.URL = window.URL || window.webkitURL;
            
            var myMsg = function(e) {
                alert("接收到的資料:" + e.data);
                alert("資料來源網域:" + e.origin);
                if (e.origin != "http://demo.cinc.biz") {
                    alert("不明來源,不處理");
                    return; //不明來源,不處理
                }

                var img_url = window.URL.createObjectURL(new Blob([e.data]));
                document.getElementById('myimg').src = img_url;
            };
            window.addEventListener("message", myMsg, false);//監聽message事件
        </script>
    </head>
    <body>
        HTML5 使用postMessage在不同網頁之間傳送圖片(接收頁面)
        <img id="myimg" width="400"/>
    </body>
</html>

DEMO:
http://demo.cinc.biz/html5-postmessage/img.html

參考:
https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage
https://developer.mozilla.org/en-US/docs/Web/API/Window.URL
https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL
https://developer.mozilla.org/en-US/docs/Web/API/Blob

沒有留言:

張貼留言