20180830_window.PostMessage跨域通信

2018-08-31  本文已影响0人  杨洋的围脖啊

背景

最近公司要求所有产品付款页面输入卡号密码信息的部分必须采用公司的统一页面。
具体实现方案是,我们将公司统一的输入卡号密码的页面通过iframe嵌入我们产品的付款页面。用户点击付款时,我们需要给iframe的页面发送消息,通知他们可以进行付款处理了。
我们产品页面与iframe内嵌的页面之间是不同域的页面。所以在通知iframe付款时,我们采用了window.postMessage方法进行通信。

window.postMessage方法介绍

假如我们的页面的window对象引用是windowParent,内嵌在iframe的页面的window对象引用是windowCard
付款时,我们需要给他们发送数据:

windowCard.postMessage(message, targetOrigin, [transfer]);

我们在发送消息给目标页面之后,目标页面进行数据处理,处理完毕后会将处理结果返回给我们的页面。

他们同样用window.postMessage给我们发送处理结果。我们通过给我们页面的message事件增加event handler来接收处理结果。

windowParent.addEventListener("message", receiveMessage, false);

function receiveMessage(event)
{
    var data = event.data;
    var origin = event.origin;
    var source = event.source;
}

如上所示,event的属性有:

样例代码(不可运行)

<div id="MyPage">
    <iframe id="checkout" url="checkout.mycompany.com/uniformcheckoutpage"></iframe>
    
    <input type="text" id="name" />
    <input type="text" id="address" />
    
    <input type="button" id="pay" />
<div>
<script type="text/javascript">
    document.querySelector("#pay").addEventListener("click", MakePayment, false);
    window.addEventListener("message", ReceiveMessage, false);
    
    function MakePayment() {
        var name = document.querySelector("#name");
        var address = document.querySelector("#address");
        windowCard.postMessage(JSON.stringify({name : name, address : address}), "checkout.mycompany.com");
    }
    
    //Assume the target frame send back response with result and errorMessage
    function ReceiveMessage(event) {
        var result = event.data.result;
        var result = event.data.errorMessage;
    }
</script>

参考:
[1] https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

上一篇下一篇

猜你喜欢

热点阅读