小tips:postMessage處理iframe跨域通信


實例

父頁面發消息給子頁面,子頁面接收消息后回復父頁面。

父頁面代碼:

<body>
    父級頁面:
    <button id="btn">給iframe子頁面傳遞消息button</button>
    <iframe src="index2.html" id="iframe1"></iframe>
    <script>
        var btn = document.getElementById('btn');
        btn.addEventListener('click',function() {
            var data = {
                message: '子頁面應該接收的消息'
            }
            // 給子頁面發送消息
            document.getElementById('iframe1').contentWindow.postMessage(data,"/");
        },false);
        
        // 接收子頁面傳遞的消息
        window.addEventListener('message',function(e) {
            console.log(e.data); // 父頁面:我接收到消息了
        },false);
    </script>
</body>

iframe子頁面代碼:

<script type="text/javascript">
    // 接收父頁面發送的內容
    window.addEventListener('message',function(e) {
        console.log(e.data) // {message: "子頁面應該接收的消息"}
        
        // 接收內容后,我們也可以給父頁面發消息
        window.parent.postMessage('父頁面:我接收到消息了','/');
    },false);
</script>

message事件

  • data 包含任意字符串數據,由原始腳本發送
  • origin 一個字符串,包含原始文檔的方案、域名以及端口(如:http://domain.example:80)
  • lastEventId 一個字符串,包含了當前的消息事件的唯一標識符。
  • source 原始文件的窗口的引用。更確切地說,它是一個WindowProxy對象。
  • ports 一個數組,包含任何MessagePort對象發送消息。

我們可以打印下子頁面接收父頁面的消息的對象,如下:

// 接收父頁面發送的內容
    window.addEventListener('message',function(e) {
        console.log(e)
    },false);

打印結果:

postMessage方法

postMessage方法支持兩個參數,具體參考下表:

  • message:發送的數據
  • targetOrigin: 發送數據的來源

postMessage方法中的message參數不僅僅可以是字符串,結構對象、數據對象(如:FileArrayBuffer)或是數組都是可以的。在IE8/IE9/FireFox3.6及其以下版本只支持字符串數據。

targetOrigin參數指接收文檔的來源。除非接收信息瀏覽上下文來源於提供的targetOrigin中的一個匹配,否則瀏覽器是不會發送消息的。直接使用"*"通配符繞開限制,但顯然這樣很不安全。您在實際使用的時候務必指定目標來源。您還可以通過使用"/"來限制信息只能同源發送。

參考地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM