iframe 父子窗口之间传值

前两天在搞一个需求的时候用到了iframe,研究了一下父子窗口之间的传值问题,只是iframe的方案不合适,但是还是记录一下怎么互相传值。

父窗口

<el-table :data="treeList" style="width:100%" border v-loading="treelistLoading">
  <el-table-column label="标题" prop="mindName" align="center">>
  </el-table-column>
  <el-table-column label="操作" align="center" width="100">
     <template slot-scope="{row}">
         <el-button type="text" @click="openBindNode(row)">查看</el-button>
      </template>
   </el-table-column>
</el-table> 
<el-dialog title="关联科技树支线" :visible.sync="addBindingDialog" width="90%">
      <div style="text-align:right">
        <el-button type="primary" @click="confirmBranchBind">关 联</el-button>
      </div>
      <!-- 回显科技树 -->
      <div class="mindViewBox">
        <!--   下面这个子组件在哪-->
        <div id="mindBindEdit" v-loading="mindLoading" element-loading-background="rgba(0, 0, 0, 0.8)" class="mindView">
          <iframe width="100%" height="100%" :src="`${IFRAMEHOST}branchBindEdit`" frameborder="0" id="branchBindEdit" :key="branchBindEditKey"></iframe>
        </div>
      </div>
    </el-dialog>

打开关联科技树的对话框时,传递数据给iframe链接的页面中

openBindNode(row) {
   this.mindLoading = true;
   this.branchBindEditKey++;//
   this.addBindingDialog = true;
   this.$nextTick(() => {
     //获取iframe
     let iframe = document.getElementById('branchBindEdit');
     // iframe的加载完成函数
     iframe.onload = function () {
       //将滑选数据传入到iframe中
       iframe.contentWindow.postMessage({ 'mindId': row.id }, '*');
     }
     this.mindLoading = false;
   })
},
// 选中某个节点后完成选择,调接口获取该节点下的所有子节点数据
confirmBranchBind() {
    let branchNode = document.getElementById('branchBindEdit').contentWindow.getSelectedNodeId();
    console.log("branchNode", branchNode)
    if (!branchNode) {
       this.$message.warning("请先选中节点!");
       return false;
    }
    this.technologyTreeList.push({
      'branchId': branchNode.branchId,
      'branchText': branchNode.branchText,
      'mindId': this.bindMindTree.id,
      'mindName': this.bindMindTree.mindName,
    });
    this.addBindingDialog = false;
    this.treeBindingDialog = false;
},

补充

 给组件加key值 是为了解决实时渲染最新的数据,只能通过key销毁组件再根据最新的数据重新渲染

vue组件销毁方法:1、v-if=" "   2、:key="  "

父窗口向子窗口传值

//获取iframe
let iframe = document.getElementById('branchBindEdit');
// iframe的加载完成函数
iframe.onload = function () {
  //将滑选数据传入到iframe中
  iframe.contentWindow.postMessage({ 'mindId': row.id }, '*');
}

 使用postMessage()向子窗口传值

父窗口调用子窗口中的方法

confirmBranchBind() {
      let branchNode = document.getElementById('branchBindEdit').contentWindow.getSelectedNodeId();
      console.log("branchNode", branchNode)
},

getSelectedNodeId() 为要调用的子窗口的方法

子窗口

在子页面的mouted函数中接受父窗口传递的数据 ,以及注册getSelectedNodeId方法供父窗口调用

 mounted() {
    let _this = this;
    console.log("进入iframe")
    window.addEventListener('message', function (event) {
      if (event.data.mindId) {
        console.log("接受传送过来的id值", event.data.mindId)
        _this.mindId = event.data.mindId;
        _this.getDetailInfo();
      }
    }, false);
    window.getSelectedNodeId = function () {
      let nodes = _this.$refs.minderEditor.minder.getSelectedNodes();
      return { 'branchId': nodes[0].data.id, 'branchText': nodes[0].data.text };
    }
},

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端页面中,可以通过使用postMessage()方法来实现iframe向子页面传值。首先,在子页面中添加一个按钮或者其他触发事件的元素,例如一个按钮元素。然后,使用JavaScript代码监听该按钮的点击事件,并在点击事件中使用window.parent.postMessage()方法将要传递的值发送给父页面。具体步骤如下: 1. 在子页面中,添加一个按钮或其他触发事件的元素。比如,在子页面的HTML代码中添加一个按钮元素,例如: ```html <button id="admin-btn">传值</button> ``` 2. 在子页面JavaScript代码中,监听按钮的点击事件,并使用postMessage()方法将要传递的值发送给父页面。例如: ```javascript $("#admin-btn").on('click', function(){ event.stopPropagation(); // 防止事件冒泡 let info = { msg: '我是子页面' }; window.parent.postMessage(info, '*'); }); ``` 这样,当点击按钮时,子页面将会向父页面传递一个包含具体信息的对象。父页面可以通过在mounted()或者其他适合的时机监听message事件来接收并处理子页面传递的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [iframe页面与子页面如何传值](https://blog.csdn.net/qq_38475901/article/details/121768098)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值