最近在给项目搭建功能的过程中遇到了个难题,因为在设计该项目时给的iframe子页面非常多,从头到尾数下来的话起码得有十多个子页面,但子页面多也并不是件好事
- 几乎每个子页面都需要用到父页面的中的方法,打开存放在父页面中与该业务相关的模态框、遮罩层,或是让父页面刷新,这都需要通过js中的parent属性去实现。
- 反过来说,父页面也始终会用到子页面中定义好的方法,而我现在碰上的难题便是如此。(比如在父中需要点击左侧菜单,触发子iframe中的某个事件,这个解决办法我在以前admin的maya代码中使用父中点击触发iframe.contentWindow.chilrenEvent ,iframe中套的是vue的页面,也就是子是一个vue组件,在vue组件的mounted中定义window.chilrenEvent
- 具体代码见下面:
一:父是admin原生开发的html页面(/admin/views/index.html#/oragnizationchildren是打包后放在服务器的页面访问路径)
<buttton onclick="initPage"></button>
<iframe id="iframe" src="C/file/DSS/admin/views/index.html#/oragnizationchildren"></iframe>
<script>
function initPage(){
//触发iframe.contentWindow.chilrenEvent
var iframe=$("#iframe")
iframe[0].contentWindow.chilrenEvent&&iframe[0].contentWindow.chilrenEvent()
}
</script>
二:子的vue组件中
method(){
requstajax(){
//请求接口刷新页面数据
}
},
mounted(){
var that=this
window.chilrenEvent=()=>{
that.requstajax()
}
}
子调用父的方法我知道通过parent属性便可以搞定,但让父调用子的方法,确实是不懂该如何解决,但当时可以想到的是:既然有parent这种属性可以帮助我们让父调用子中的方法,那么也一定会有和parent类似作用的属性存在,所以接下来我便只好在求助万能的互联网。在互联网大哥的帮助下,果然不出我所料,让我找到了本期的主人公ContentWindow属性。
也许是ContentWindow属性比较冷门吧,在W3school离线学习文档中找不到它的存在,但是它却是真实有效的,完全可以在js中被使用: