当前位置: 首页 > news >正文

postMessage 收到消息类型 “webpackWarnings“

场景描述:

        当A系统中的parent页面使用iframe内嵌C系统的child页面,并且在parent页面中通过postMessageg给child页面发送消息时,如果C系统中使用了webpack,则webpack也会给child页面发送消息 ,消息类型为webpackWarnings。那么如何使parent页面和child页面正确通信呢,主要分为以下两步。

1,parent页面要在iframe 加载完成之后,再给child页面发消息,同时约定好发送数据的格式

// parent.vue
<iframe
      ref="iframeRef"
      width="100%"
      class="iframe-msg-content"
      src="my-src"
      frameborder="0"
    ></iframe>
    <script setup>
    import {onMounted, onUnmounted} from 'vue';
    

    onMounted(()=>{
    iframeRef.value.onload = () => {
        // iframe 加载完成之后,获取iframe 内嵌子页面窗口
        const childWindow = iframeRef.value.contentWindow;
        const messageData = {
          type: '约定的消息类型',
          data: 要发送的数据,
        };
        // postMessage 发送字符串类型的数据才能被目标窗口接收
        childWindow.postMessage(JSON.stringify(messageData), 'ip+端口');
      };
      window.addEventListener('message', handleMessage, false);
    });
    
    onUnmounted(() => {
      window.removeEventListener('message', handleMessage, false);
    });
    </script>
    
    // 先给一个默认的宽高
    .iframe-msg-content{
    width: 100%;
    height: 400px
    }

 2,child页面监听message 事件获取来自parent页面发送的数据

// child.html最外层元素 .page-container
<div class="page-container" ref="pageContainer"></div>

<script setup lang="ts">
import {ref,reactive, onMounted, onUnmounted} from "vue";
const pageContainer = ref();
const state = reactive({
    
})

/**
     * @description: 消息处理
     * @return {*}
     */
    const handleMessage = (event:MessageEvent) => {
    // 因为webpack 发送的数据是对象类型,parent 页面发送的是经过JSON.stringify转换的字符串类型的
     // 过滤来自webpack发送的possMessage 消息
      if (Object.prototype.toString.call(event.data) === '[object String]') {
        const message = JSON.parse(event.data);
        if (message?.type === '约定好的数据type') {
            // 处理来自parent 页面的数据
        }
      }
    };

onMounted(()=>{
   window.addEventListener('message', handleMessage);
})

 onUnmounted(() => {
      window.removeEventListener('message', handleMessage);
    });
</script>

注意:

1,postMessage 发送字符串类型的数据才能被内嵌子页面接收。

2,通过类型过滤webpack发送的消息。

http://www.lryc.cn/news/410144.html

相关文章:

  • 计算机基础(day1)
  • cesium添加流动线
  • 使用java自带的队列进行存取数据ArrayBlockingQueue 多线程读取ExecutorService
  • 【音视频之SDL2】Windows配置SDL2项目模板
  • JavaScript 里的深拷贝和浅拷贝
  • Oracle基础-集合
  • 《浅谈如何培养树立正确的人工智能伦理观念》
  • uniapp实现局域网(内网)中APP自动检测版本,弹窗提醒升级
  • 【Golang 面试 - 进阶题】每日 3 题(六)
  • Unity横板动作游戏 -项目准备
  • 基于Gunicorn + Flask + Docker的高并发部署策略
  • jdk版本管理利器-sdkman
  • Kafka知识总结(事务+数据存储+请求模型+常见场景)
  • C#中重写tospring方法
  • 【机器学习基础】机器学习的数学基础
  • fastapi之零
  • SpringBoot整合PowerJob 实现远程任务
  • 【扒模块】DFF
  • frameworks 之Socket
  • WEB前端开发中如何实现大文件上传?
  • ts给vue中props设置指定类型
  • 模拟实现c++中的list模版
  • 从信息论的角度看微博推荐算法
  • CISC(复杂指令集)与RISC(精简指令集)的区别
  • 自定义数据库连接的艺术:Laravel中配置多数据库连接详解
  • 力扣高频SQL 50题(基础版)第八题
  • 【C++20】从0开始自制协程库
  • Docker 深度解析:从入门到精通
  • [C++] 模板编程-02 类模板
  • 嵌入式C++、STM32、树莓派4B、OpenCV、TensorFlow/Keras深度学习:基于边缘计算的实时异常行为识别