vue使用ifram标签解决父子页面传值,触发事件的操作

应用场景一、

1、首先需要明确的一点,标题所说的子页面调用父页面的方法或者函数,是需要父子页面配合的。如果子页面不是你自己开发的, 或者父页面不是自己开发的,那就没办法调用了。而且, 因为业务的特殊需要,我们用到了iframe,如果只是Vue两个父子组件的传值或者调用,其实是非常简单的,百度一下,就能出现很多。这里就不一一赘述了。

在明确了以上的点以后,开始这一次的分享。首先先说一下, 没有在Vue框架中, 就是单纯的HTML页面,子页面调用父页面的函数,其实非常的简单。在子页面中,有一个windows.parent的方法。我们打印来看一下这个方法中有什么东西;

  

vue keyframes变量_前端


这还是一个windos的对象,而且里面居然有了我在父页面中定义的方法,大家可以看下,父页面的代码。
父页面的代码:

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
 </head>
 <body>
     <p>这里是父元素</p>
     <iframe src="./child.html" frameborder="0"></iframe>
 </body>
 <script>
     function myconsole(a){
         console.log(a);
         console.log("这里是父元素的方法")
     }
 </script>
 </html>

其实这样的话就已经很简单了,子页面要是想要调用父页面的方法,只需要在windos.parent中调用父组件定义好的方法就行了。下面是子页面的代码。
子页面的代码:

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
 </head>
 <body>
     <h1>这里是子元素</h1>
     <button >按钮</button>
 </body>
 <script>
     var btn = document.getElementById("btn")
     btn.onclick = function(){
         console.log('子元素点击了')
         window.parent.myconsole("哈哈哈,这是传参");
         console.log(window);
         console.log(window.parent);
     }
 </script>
 </html>

应用场景二、

同时,我们可以看到,这个是可以传参的。如果需要传参的话,直接在这里传参就好了。
  上面说完了普通的传值,其实Vue中的就很简单了。但是Vue中需要注意的一个点就是,在父页面中的methods定义了方法,需要在mounted的时候,把这个方法暴露给window的全局对象;
父页面代码Vue:

export default {
   name: "parent",
   data() {
     return {};
   },
   props: {},
   mounted() {
     window.myconsole = this.myconsole;// 这里需要暴露给全局,这样的话,子页面才能调用相对应的方法
   },
   components: {},
   computed: {},
   methods: {
     myconsole(){
         console.log("这里是调用父元素中的方法");
     },
   }
 };

子页面想要调用其实也是很简单的,请看下面的代码:
子页面的Vue代码:

<template>
     <div >
         <button @click="clo">按钮</button>
     </div>
 </template>
 <script>
 export default {
   name: "child",
   data() {
     return {};
   },
   props: {},
   mounted() {
     window.myconsole = this.myconsole;
   },
   components: {},
   computed: {},
   methods: {
     clo(){
         console.log('点击了子页面的按钮')
         window.parent.myconsole();
     },
   }
 };
 </script>

这样的话,就实现了,上面所说的,子页面调用父页面的方法。同时也是实现了,父子页面的传值。不过需要说明的一点就是,这个没办法直接调试,因为必须打包完成之后才能在iframe中引入。所以大家在做这一方面的时候,多加打印日志。等到调试完成之后,在删除打印的东西。

跨域可以通过:document.domain来处理,详情请百度

应用场景三、

HTML的IFRAME跨域嵌套VUE项目页面,使用POSTMESSAGE的方法实现父子页面传值
标签: 个人笔记 前端开发 #+ 关于vue vue.js javascript html5
当前应用场景:u3d和前端项目对接,需要使用到前端的设置页面和详情功能,需要操作前端项目的方法,比如打开vue项目的弹窗,修改详情的数据等操作,当前记录的是修改vue页面的数据操作。vue项目使用技术:vue和less编写样式,html页面使用技术:html5和javascript
使用方案:postMessage的方法
vue向iframe发送数据的方法:

sendMessage(data) {
      //子向父发送数据
      window.parent.postMessage(
        {
          data: data,
        },
        "*"
      );

iframe接收vue数据的方法:

window.addEventListener('message',function(event){
 
              //父接收子数据
              //  数据在event.data对象中
            console.log(event.data,222)
          })

iframe向vue发送数据的方法:

var btn = document.getElementById("btn")
        btn.onclick = function(){
            // 父向子发送数据
            let frame = document.getElementById('child');  // 或者用vue语法 let frame = this.$refs.iframeId
            frame.contentWindow.postMessage({
              name:'i am a father'
            },'*'); 
        }

vue页面监听iframe发来的数据:

window.addEventListener("message", this.testsend, false);
 testsend(event) {
 
      if (event.data.name == "i am a father") {
 
     //vue事件
 
        this.xiugai();
 
      }
 
    },

完整代码:

html:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>iframe嵌套vue页面</title>
    </head>
    <body>
        <iframe src="http://localhost:8081/#/" id="child" scrolling="no" width="500px" height="580px"></iframe>
        <input type="button" id="btn" value="调用子页面方法" />
    </body>
    <script>
        var btn = document.getElementById("btn")
        btn.onclick = function(){
            // 父向子发送数据
            let frame = document.getElementById('child');  // 或者用vue语法 let frame = this.$refs.iframeId
            frame.contentWindow.postMessage({
              name:'i am a father'
            },'*'); 
        }
        //父 接收子的方法
        window.addEventListener('message',function(event){
              //  数据在event.data对象中
            console.log(event.data,222)
          })
    </script>
</html>

vue代码:

<template>
  <div class="act-form content">
    <div class="rightBox">
      <div class="scorll-content">
        <ul>
          <li
            v-for="(data, index) in dataList"
            :key="index"
            :class="{ shutdown: data.state == 'shutdown' }"
            @click="sendMessage(data)"
          >
            <div class="date">{{ data.date }}</div>
            <div>{{ data.desc }}</div>
          </li>
        </ul>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: "index",
  data() {
    return {
      dataList: [
        {
          id: "0",
          date: "2020/10/09 19:00:00",
          desc: "机器爆炸,炸裂燃伤,机器粉碎加燃伤变形",
          state: "normal",
        },
        {
          id: "1",
          date: "2020/10/09 19:00:00",
          desc: "机器爆炸,炸裂燃伤,机器粉碎加燃伤变形",
          state: "normal",
        },
        {
          id: "2",
          date: "2020/10/09 19:00:00",
          desc: "机器爆炸,炸裂燃伤,机器粉碎加燃伤变形",
          state: "shutdown",
        },
        {
          id: "3",
          date: "2020/10/09 19:00:00",
          desc: "机器爆炸,炸裂燃伤,机器粉碎加燃伤变形",
          state: "normal",
        },
        {
          id: "4",
          date: "2020/10/09 19:00:00",
          desc: "机器爆炸,炸裂燃伤,机器粉碎加燃伤变形",
          state: "normal",
        },
        {
          id: "4",
          date: "2020/10/09 19:00:00",
          desc: "机器爆炸,炸裂燃伤,机器粉碎加燃伤变形",
          state: "normal",
        },
      ],
    };
  },
  methods: {
    sendMessage(data) {
      //子向父发送数据
      window.parent.postMessage(
        {
          data: data,
        },
        "*"
      );
    },
 
    xiugai() {
      console.log("我修改了第二条数据的描述");
      this.dataList[1].desc =
        "小case啦小case啦小case啦小case啦小case啦小case啦";
    },
 
    testsend(event) {
      if (event.data.name == "i am a father") {
        this.xiugai();
      }
    },
  },
  mounted() {
    //监听iframe发来的事件监听
    window.addEventListener("message", this.testsend, false);
    //监听父页面发来的数据
    // window.addEventListener("message", function (event) {
    //  数据在event.data对象中
    // console.log(event.data, 1111);
    // });
  },
};
</script>
<style lang="less" scoped>
.content {
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
  overflow: hidden;
  z-index: 200;
  position: absolute;
  //   background: url("../../static/img/big-bg.png");
  background-size: cover;
  background-position: center;
  .rightTip {
    overflow: hidden;
    position: absolute;
    top: 71px;
    right: 15px;
    margin: 0;
    padding: 0;
    width: 510px;
    color: #fff;
    text-align: center;
    font-size: 15px;
  }
  .seamless-warp,
  .rightBox {
    // height: calc(100% - 570px);
    overflow: hidden;
    position: absolute;
    top: 100px;
    right: 25px;
    margin: 0;
    padding: 0;
    width: 400px;
    color: #fff;
    .scorll-content {
      ul {
        li {
          background: #1a3251;
          font-size: 15px;
          opacity: 1;
          margin: 12px 0;
          padding: 0px 0px 0px 15px;
          border-radius: 0 0 5px 0;
          text-align: left;
          .date {
            color: #52657b;
            font-size: 15px;
          }
        }
        li:last-child {
          margin-bottom: 0;
        }
        .shutdown {
          background: #781e21;
        }
      }
    }
    .btn {
      border: 1px solid #000;
      width: 100px;
      background: #000;
      margin: 10px;
      cursor: pointer;
    }
  }
  .bottomBtn {
    width: 500px;
    margin: 0;
    padding: 0;
    position: absolute;
    bottom: 10px;
    right: 550px;
    height: 50px;
    .btn {
      padding: 0 10px;
      background: #fff;
      height: 50px;
      line-height: 50px;
      display: inline-block;
      margin: 0 10px;
    }
  }
  .otherBtn {
    margin: 0;
    padding: 0;
    position: absolute;
    bottom: 100px;
    right: 25px;
    height: 50px;
    div {
      padding: 0 10px;
      background: #fff;
      line-height: 50px;
      display: inline-block;
      margin: 0 10px;
    }
  }
}
</style>

实现效果:

html页面:

vue keyframes变量_vue keyframes变量_02


vue页面:

vue keyframes变量_html_03