窗口間通信postMessage

窗口間的通信用的地方還是挺多的,比如彈出qq登錄認(rèn)證窗。先上兼容性


兼容性

基本用法其實(shí)也比較簡(jiǎn)單。
window.open方法會(huì)返回一個(gè)窗口對(duì)象,使用這個(gè)對(duì)象可以向子窗口發(fā)送消息,而子窗口可以通過(guò)window.opener向父窗口發(fā)送消息,先新建兩個(gè)html
index.html(只展示body,其他地方省略了)

<body>
    <button onclick="opwin()">打開(kāi)</button>
    <script type="text/javascript">
    function opwin() {
        //保留窗口對(duì)象
        var popup = window.open("test.html", "_blank");
    }
    function receiveMessage(event) {
        //event.origin是指發(fā)送的消息源,一定要進(jìn)行驗(yàn)證?。?!
        if (event.origin !== "http://localhost")return;
        //event.data是發(fā)送過(guò)來(lái)的消息。
        console.log(event.data);
        //event.source是指子窗口,主動(dòng)向子窗口發(fā)送消息可以用popup
        //postMessage有兩個(gè)參數(shù),消息和自己的源(例如http://www.baidu.com),自己的源應(yīng)該和目標(biāo)源相同。否則發(fā)送會(huì)失敗。
        event.source.postMessage("我是主窗口,我接收到消息了",window.location);
    }
    //添加消息接收函數(shù)
    window.addEventListener("message", receiveMessage, false);
    </script>
</body>

test.html

<body>
    <button onclick="send()">發(fā)送</button>
    <script type="text/javascript">
    function send() {
        //window.opener指的就是父窗口(打開(kāi)本窗口的窗口)
        window.opener.postMessage("我是子窗口,向主窗口發(fā)送消息", window.location);
    }
    function receiveMessage(event) {
        if (event.origin !== "http://localhost")return;
        console.log(event.data);
    }
    window.addEventListener("message", receiveMessage, false);
    </script>
</body>

由于postMessage是通過(guò)網(wǎng)絡(luò)協(xié)議,所以不能以直接在瀏覽器打開(kāi)html的方式進(jìn)行調(diào)試。而是應(yīng)該放在服務(wù)器上,走網(wǎng)絡(luò)協(xié)議
比如,這樣是不對(duì)的


錯(cuò)誤

這樣才行

正確
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作者:阮一峰 日期:2016年4月 8日 瀏覽器安全的基石是"同源政策"(same-origin policy)。...
    起名字太累閱讀 722評(píng)論 0 1
  • 實(shí)時(shí)消息協(xié)議---流的分塊 版權(quán)聲明: 版權(quán)(c)2009 Adobe系統(tǒng)有限公司。全權(quán)所有。 摘要: 本備忘錄描...
    一個(gè)人zy閱讀 2,079評(píng)論 0 9
  • (關(guān)于跨域通信問(wèn)題,先要將服務(wù)器配置好,添加兩個(gè)不同域名,方便操作) 一、跨文檔消息通信(同域名) iframe ...
    EndEvent閱讀 440評(píng)論 0 1
  • 什么是同源策略 瀏覽器出于安全方面的考慮,只允許與本域下的接口交互。不同源的客戶端腳本在沒(méi)有明確授權(quán)的情況下,不能...
    ezrealor閱讀 564評(píng)論 0 1
  • 傷害我別以愛(ài)之名, 否則我會(huì)判你無(wú)期徒刑。 不用擔(dān)心我會(huì)有所行動(dòng), 我只是在心里對(duì)你默默地執(zhí)行。 因?yàn)橐呀?jīng)不需要去...
    琢玉書(shū)生閱讀 180評(píng)論 0 1

友情鏈接更多精彩內(nèi)容