欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue組件和iframe頁(yè)面的相互傳參問(wèn)題及解決

 更新時(shí)間:2022年05月31日 15:48:03   作者:weixin_42108617  
這篇文章主要介紹了vue組件和iframe頁(yè)面的相互傳參問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue組件和iframe頁(yè)面相互傳參

目前網(wǎng)上大多關(guān)于iframe父子傳參的博客都是在敘述父頁(yè)面是html文件,子iframe文件也是html文件,涉及到父頁(yè)面是vue組件子iframe頁(yè)面是html的博客多數(shù)講的不是很明白;

而最近我在項(xiàng)目中碰到了這種需求:在vue組件中嵌入iframe頁(yè)面,并實(shí)現(xiàn)父子傳參;

vue組件調(diào)用iframe頁(yè)面方法和參數(shù)

下面是在 vue組件中(父組件) 一個(gè)通過(guò)點(diǎn)擊按鈕觸發(fā)的方法:

 sentToIframe() {
      let childFrameObj = document.getElementById("unityiframe");
      console.log("childFrameObj", childFrameObj);
      // childFrameObj.contentWindow.getMessageFromParent(this.tData); //第一種向子iFrame傳參方式,調(diào)用iframe的methods達(dá)到傳參的目的
      this.$refs.unity.contentWindow.getMessageFromParent(this.tData); // 這樣也是可以調(diào)用子iframe的方法
      // childFrameObj.contentWindow.frameData = "這是vue組件給你的參數(shù)!" // 傳參成功
      this.$refs.unity.contentWindow.frameData =
        "這是vue組件給你的第二個(gè)參數(shù)!"; //傳參成功
      console.log("發(fā)送完成");
      //此外,還可以通過(guò)DOM操作,操作子iframe的DOM
      var t = document
        .getElementById("unityiframe")
        .contentWindow.document.getElementById("dd");
      console.log(t);
      //
      console.log("frameData?", unityiframe.window.frameData); //利用id可以調(diào)用到iframe里的變量
      // console.log("frameData?",this.$refs.unity.window.frameData) //利用ref調(diào)用不到iframe里的變量
    },

子組件 iframe頁(yè)面 中有一個(gè)被調(diào)用的方法及變量:

  var frameData = "別喊我!" //此變量用于測(cè)試 vue組件是否能調(diào)用此變量
  function getMessageFromParent(value){
    // 接受從vue組件中傳過(guò)來(lái)的參數(shù)
    console.log(`我接收到parent傳過(guò)來(lái)的參數(shù)了:${value}`)
  }

點(diǎn)擊按鈕的結(jié)果是:

iframe頁(yè)面向vue組件傳參

vue組件中有一個(gè)供iframe頁(yè)面調(diào)用的方法:

    getFromIframe(value) {
      console.log(`我是iframe傳過(guò)來(lái)的參數(shù):${value}`);
      console.log("我被iframe調(diào)用了!");
      console.log(this.vueData);
      console.log(`改變前是:你是否能夠改變我;改變后是:${this.isChangeMe}`);
    }

iframe調(diào)用vue組件方法的代碼:

  function Obj(res){
  // Obj通過(guò)按鈕點(diǎn)擊觸發(fā)
    console.log(parent)
        // 調(diào)用vue組件方法
      parent.getFromIframe("我叫iframe")
      // 向vue組件發(fā)送參數(shù) && 改變vue組件的參數(shù)
      parent.isChangeMe = "你已經(jīng)被我iframe改變了"
  }

但是 ?。。。。。。。。。。。。。。?/strong>

只這么做是不夠的,會(huì)報(bào)錯(cuò),如下:

個(gè)人猜想: 問(wèn)題的原因是 iframe的parent并不是vue實(shí)例!

目前只找到了一個(gè)辦法來(lái)解決這個(gè)問(wèn)題:

就是在created鉤子里加上這兩句,

  created() {
    window.getFromIframe = this.getFromIframe; //把vue實(shí)例中的方法引用給window對(duì)象
  },

在調(diào)用的vue實(shí)例的方法中 加上對(duì)vue內(nèi)變量的改變

    getFromIframe(value) {
      console.log(`我是iframe傳過(guò)來(lái)的參數(shù):${value}`);
      console.log("我被iframe調(diào)用了!");
      console.log(this.vueData);
      this.isChangeMe = window.isChangeMe;// 把window變量 賦值給 vue 實(shí)例變量;使得在iframe中能夠改變vue實(shí)例中變量
      console.log(`改變前是:你是否能夠改變我;改變后是:${this.isChangeMe}`);
    }

最終的運(yùn)行結(jié)果是:

bingo?。。。?! 問(wèn)題暫時(shí)得到了解決。

小結(jié)一下:vue組件iframe 的嵌入麻煩多多,且目前還沒(méi)還沒(méi)找到正統(tǒng)的方法;此外,還有很多坑我還沒(méi)踩到,如果后續(xù)這方面有什么問(wèn)題 以及 其他的解決方案,我會(huì)繼續(xù)更新到這上面來(lái)的!

內(nèi)嵌iframe頁(yè)面并進(jìn)行傳值

需求是把兩個(gè)單獨(dú)的系統(tǒng)在一個(gè)總的系統(tǒng)作為菜單進(jìn)行免密登錄,由于時(shí)間還有跨域和不同的token等問(wèn)題,就使用了內(nèi)嵌iframe,因?yàn)槭遣煌挠蛎M(jìn)入子系統(tǒng)也要本地存儲(chǔ)一下(獲取的user信息以及token傳入到iframe子系統(tǒng))

<template>
? <div class="hello">
? ? <div>
? ? ? <iframe src="http://xxxxxxxxxxxxxx" frameborder="0" ?id="myIframe" ref="myIframe"></iframe>
? ? </div>
? </div>
</template>
export default {
? mounted() {
? ? this.iframeWin = this.$refs.myIframe.contentWindow;
? ? //最開(kāi)始做的是點(diǎn)擊事件是沒(méi)有問(wèn)題的 ?后面需要自動(dòng)傳值就不行 ?也試了模擬點(diǎn)擊還是不行
? ? //原因是iframe還沒(méi)加載完 ?所以使用onload
? ? document.getElementById("myIframe").onload=function(){
? ? ? this.fatherpost()
? ? };
? }
? methods:{
? ? fatherpost(e){//iframe傳值
? ? ?? ? this.iframeWin.postMessage({
? ? ?? ? ? ? params:{
? ? ? ? ? ? ? ?data:data//傳的數(shù)據(jù)
? ? ? ? ? ? ?}
? ? ?? ? },'http://xxxxxxxxxxxxxx')
? ? },
? }
}
//iframe接收
export default {
? mounted() {
? ? ?window.addEventListener('message',function(e){
?? ? ? console.log(e.data)
? ? ?},false)
? }
}
//子傳父的話 ? 掛載和接收的方式都是差不多
window.parent.postMessage(message, targetOrigin, [transfer])

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解如何使用vue-cli腳手架搭建Vue.js項(xiàng)目

    詳解如何使用vue-cli腳手架搭建Vue.js項(xiàng)目

    這篇文章主要介紹了詳解如何使用vue-cli腳手架搭建Vue.js項(xiàng)目 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • vue為什么v-for的優(yōu)先級(jí)比v-if高原理解析

    vue為什么v-for的優(yōu)先級(jí)比v-if高原理解析

    這篇文章主要為大家介紹了vue為什么v-for的優(yōu)先級(jí)比v-if高原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Vue axios獲取token臨時(shí)令牌封裝案例

    Vue axios獲取token臨時(shí)令牌封裝案例

    這篇文章主要介紹了Vue axios獲取token臨時(shí)令牌封裝案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Vue編寫(xiě)多地區(qū)選擇組件

    Vue編寫(xiě)多地區(qū)選擇組件

    這篇文章主要為大家詳細(xì)介紹了Vue編寫(xiě)一個(gè)挺靠譜的多地區(qū)選擇組件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Vue實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)el-select組件的示例代碼

    Vue實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)el-select組件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)el-select組件的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的的可以參考一下
    2023-02-02
  • 詳解Vue的組件注冊(cè)

    詳解Vue的組件注冊(cè)

    組件是Vue.js最強(qiáng)大的功能之一。組件可以擴(kuò)展HTML元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能,需要的朋友可以參考下
    2023-05-05
  • Vue2模版編譯流程詳解

    Vue2模版編譯流程詳解

    vue中有一張響應(yīng)式系統(tǒng)的流程圖,vue會(huì)將模板語(yǔ)法編譯成render函數(shù),通過(guò)render函數(shù)渲染生成Virtual?dom,但是官方并沒(méi)有對(duì)模板編譯有詳細(xì)的介紹,這篇文章帶大家一起學(xué)習(xí)下vue的模板編譯
    2023-07-07
  • vue如何判斷dom的class

    vue如何判斷dom的class

    這篇文章主要介紹了vue如何判斷dom的class,vue點(diǎn)擊給dom添加class然后獲取含有class的dom文件,具體內(nèi)容詳情大家參考下本文
    2018-04-04
  • 使用Vue3創(chuàng)建多布局系統(tǒng)的三種方法

    使用Vue3創(chuàng)建多布局系統(tǒng)的三種方法

    布局是中大型網(wǎng)站或應(yīng)用的基礎(chǔ),假設(shè)你正在創(chuàng)建一個(gè)網(wǎng)頁(yè)應(yīng)用,它包括主頁(yè)、營(yíng)銷(xiāo)頁(yè)面和應(yīng)用頁(yè)面,你不會(huì)想要為每一頁(yè)重復(fù)所有的工作,對(duì)吧,與Nuxt不同,Vue 3并沒(méi)有內(nèi)置的布局系統(tǒng),但是別擔(dān)心,這里將向你展示3種簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)這一點(diǎn),需要的朋友可以參考下
    2023-08-08
  • vue iview實(shí)現(xiàn)動(dòng)態(tài)路由和權(quán)限驗(yàn)證功能

    vue iview實(shí)現(xiàn)動(dòng)態(tài)路由和權(quán)限驗(yàn)證功能

    這篇文章主要介紹了vue iview實(shí)現(xiàn)動(dòng)態(tài)路由和權(quán)限驗(yàn)證功能,動(dòng)態(tài)路由控制分為兩種:一種是將所有路由數(shù)據(jù)存儲(chǔ)在本地文件中,另一種則是本地只存儲(chǔ)基本路由,具體內(nèi)容詳情大家參考下此文
    2018-04-04

最新評(píng)論