vue使用iframe嵌入html,js方法互调

摘要:
且扯远了下面进入主题一、vue调用html中方法这个还是挺简单的直接window.frames['iframename'].方法名如:invokeHtmlMethod(){window.frames['iframeMap'].lodaTable()},二、html调用vue中方法这个就有点难做了;第一个当然会想到直接将方法绑到window上了;create(){window.vueDefinedMyProp==˃{this.receiveParamsFromHtml}},methods:{receiveParamsFromHtml{console.log},}然后html页面中是这样functioninvockIframeMethod(){window.parent['vueDefinedMyProp']('youareSuperman!');}运行报错了VM345:1UncaughtTypeError:window.parent.vueDefinedMyPropisnotafunctionat:1:15三、网络查询资料后来去网上看见这朋友是这么做得博客地址https://www.cnblogs.com/xiangsj/p/5895917.html于是我就照着改了试试;data(){return:{randomObj:{edit:'edit_'+newDate().getTime()//先定义随机ID}}},created(){let_this=this;//这里可放到全局,提供给子iframe调用window[this.randomObj.edit]==˃{this.receiveParamsFromHtml//VUE中方法}},methods:{receiveParamsFromHtml{console.log},}html页面是这样functioninvockIframeMethod(){varfatherId=nullwindow.parent[fatherId.edit]('youareSuperman!

前段时间 使用h5搞了个用cesium.js做的地图服务功能,后来想整合到vue项目,当然最简单的就是iframe直接拿来用了。
但html和vue的方法交互就是成了问题,vue调用html种方法还好,尤其是html调用vue中的方法当初就没有解决,忙着项目上线直接搞了个setInterval不停轮询,哎不说他了;
现在空点了来把问题解决了,俗话说得好闲时学来忙时用,闲时不学忙时莫得用,所以各位走过路过的朋友看过来看过来,要买乡音这边来(程序员改摆地摊了,哈哈哈)。且扯远了下面进入主题

一、 vue调用html中方法

这个还是挺简单的 直接window.frames['iframe name'].方法名
如:

invokeHtmlMethod() {
        window.frames['iframeMap'].lodaTable()
      },

二、html调用vue中方法

这个就有点难做了(准确来说是采坑了);第一个当然会想到直接将方法绑到window上了;

create(){
        window.vueDefinedMyProp = (receiveParams) =>{
          this.receiveParamsFromHtml(receiveParams)
        }
      },
        methods: {
          receiveParamsFromHtml(res){
            console.log(res)
          },
     }

然后html页面中是这样

<script>
  functioninvockIframeMethod() {
    window.parent['vueDefinedMyProp']('you are Superman!');
  }
</script>

运行报错了

VM345:1 Uncaught TypeError: window.parent.vueDefinedMyProp is not a functionat <anonymous>:1:15

三、网络查询资料

后来去网上看见这朋友是这么做得
在这里插入图片描述
博客地址 https://www.cnblogs.com/xiangsj/p/5895917.html

于是我就照着改了试试;

data(){
  return: {
     randomObj: {
      edit: 'edit_' + new Date().getTime()   //先定义随机ID
}
    }
  },

 created() {
     let _this = this;
     //这里可放到全局,提供给子 iframe 调用
window[this.randomObj.edit] = (_this) =>{
    this.receiveParamsFromHtml(_this) //VUE 中方法
}
},
  methods: {
          receiveParamsFromHtml(res){
            console.log(res)
          },
  }

html页面是这样

  functioninvockIframeMethod() {
        var fatherId = nullwindow.parent[fatherId.edit]('you are Superman!');
  }

不行报错的;;;,

四、新建项目测试

最后没办法,俺新建一个项目
将代码 改成这样

data(){
  },

 created() {
    //初始化时为window绑定一个方法
      window['vueDefinedMyProp'] = (receiveParams) =>{
        this.receiveParamsFromHtml(receiveParams)
      }
},
  methods: {
          receiveParamsFromHtml(res){
            console.log(res)
          },
  }

html页面改成这样

  functioninvockIframeMethod() {
    //是用widow调用vue绑定的vueDefinedMyProp方法
    window.parent['vueDefinedMyProp']('you are Superman!');
  }

’试试。。咦;OK了
在这里插入图片描述

五、两个项目比对,找出错误

奇葩的是吧代码拷贝到原来的那个项目运行依然报错;
刚开始以为是cesium影响了,我就新建个页面来试试;还是不对;
又想到是不是element ui影响了,我又到新建的项目(不报错的这个项目)里去也把element ui 也安装上,但是运行依然可以;
这初步排除了并不是这两者影响造成的错误;调来调去始终就是不行,
难道是项目搭建的有问题??这个也不大可能呀;
执着的我就不信还找不到问题所在;
最后吧两个项目代码一比对:才发现是自己疏忽了,看下面代码

在这里插入图片描述
不要意思带大家绕了这么大一圈,是这该死的单词createcreated(一个一般现在时,一个过去式)区别就这么大~
哎,有时候自己给自己挖个坑,可能比别人挖得坑还要难爬出啦

六、完整实例

好了问题终于解决了,完整代码如下

vue页面

<template>
    <button @click="invokeHtmlMethod">调用html种方法</button>
    <div class="iframestyleset">
      <iframe  name = "iframeMap"    v-bind:src="http://t.zoukankan.com/getPageUrl"width="100%" height="100%"frameborder="0" scrolling="no" ref="iframeDom"
      ></iframe>
    </div>
</template>
export default{
    data() {
      return{
        getPageUrl: 'static/testMsgWithIframe.html'}
    },
    created() {
      //初始化时为window绑定一个方法
      window['vueDefinedMyProp'] = (receiveParams) =>{
        this.receiveParamsFromHtml(receiveParams)
      }
    },
    methods: {
      receiveParamsFromHtml(res) {
        console.log(res)
      },
      invokeHtmlMethod() {
        window.frames['iframeMap'].lodaTable()
      },
  }

html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button onclick="invockIframeMethod()">点击调用iframe</button>
<script>
  functioninvockIframeMethod() {
    //是用widow调用vue绑定的vueDefinedMyProp方法
window.parent['vueDefinedMyProp']('you are Superman!');
  }
  functionlodaTable() {
    let num = 10;
    while(num>0){
      console.log(`number : ${num}`);
      num--;
    }
  }
</script>
</body>
</html>

最后运行结果

在这里插入图片描述

都是你的错~粗心惹的祸,记录记录。,欢迎加群一起交流入群一起交流

免责声明:文章转载自《vue使用iframe嵌入html,js方法互调》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python札记 -- 使用easy_install进行模块/包管理前端点击按钮展示、隐藏对应的 元素下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

js linq库

http://jsl.solomon-yu.cn/JSE/ jsExtension实现类型C#的Linq功能 更新日志 查看更新日志 文件 jsExtension.js jsExtension.min.js jsExtensionTest.js 全局公用常量及函数(所有线程共用) 函数 备注 使用示例 $$.enumeration....

关于react实现类似vue keep-alive 的cache router的功能解决方案

// 问题来源 众所周知react是单页面应用,在路由发生变化的时候,她所对应的页面或者组件会被卸载。当路由加载的时候,原页面所有的数据都会重新加载 这在移动端的用户体验可能是一个重大灾难! 比如列表滚动到第20页或者tab切换第三个tab 再去滚动列表进入详情页,当你返回的时候你原来的浏览记录被重新加载了,这个体验会是非常差。 react官方...

Vue安装与简单使用

Vue入门 使用Typora打开https://pan.baidu.com/s/1Mf3ZFSthdVUQevqWr777eA 提取码: hg9b vue中文官网教学 安装与使用,我也经常看这个 点击进入 认识Vue Vue (读音 /vjuː/,类似于 **view**) 是一套用于构建用户界面的**渐进式框架** 安装Node.js...

基于Vue实现拖拽效果及阻止拖拽

参考地址:基于Vue实现拖拽效果 参考链接中讲的比较详细,我只使用了其中自定义指令的方法。整体代码如下: <template> <!-- 卡片 --> <div v-drag id="card"> </div> </template> <script>...

移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器

前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传。 这个功能模块主要有这5点比较难:   1手机获取相册的图片文件,拍照的图片文件,通过js 的自带的img对象,获取图片对象。     2.图片的压缩,采用canvas 画布进行压缩图片,...

Vue 返回上一页,记住上一页的数据

问题:在搜索页面,搜索出饼干商品,点击某饼干商品进入商品详情页,再从商品详情页返回到搜索页面后, 搜索页面应该依旧保留之前的搜索结果。 解决方式 ==============搜索页面路由设置=================================== {// 搜索path: 'search',name: 'search',component:...