当前位置:  开发笔记 > 前端 > 正文

从iframe调用组件功能

如何解决《从iframe调用组件功能》经验,为你挑选了1个好方法。

我的窗口中有一个iframe,我用jquery添加了新的按钮.在迁移到angular2之前,我使用parent.SampleFunction()从iframe调用父代的函数.现在,parent是一个角度组件,它不起作用.

export class AppComponent {

 // use jquery to find the iframe and put a button into it
 addButtonToIFrame() {
     ...
     let buttonHtml = ""
     ...
 }

 SampleFunction() {
  ...
 } 

}

我该如何更改onclick功能以访问父级?



1> n00dl3..:

同源Iframe

您可以安全地访问window.parent对象,因此您只需将您SampleFunction置于全局window对象中即可.

export class AppComponent {

 constructor(){
  (window).SampleFunction= this.SampleFunction.bind(this);
 }

 // use jquery to find the iframe and put a button into it
 addButtonToIFrame() {
     ...
     let buttonHtml = ""
     ...
 }

 SampleFunction() {
  ...
 }
} 

如果您有多个相同类的实例并且您SampleFunction处理组件状态,则可能需要为您创建随机名称SampleFunction.

您也可以使用PostMessageAPI,这应该是一个更灵活的选择.

PostMessage API

如果您正在处理来自其他域的iframe,则可以使用PostMessage API:

iframe中的脚本

window.parent.postMessage({foo:"foo"});

父内部的组件

export class AppComponent {

 @HostListener("window:message",["$event"])
 SampleFunction($event:MessageEvent) {
  if (event.origin !== "protocol://my-expected-domain.tdl:port")
    return;
  console.log($event.data)// {foo:"foo"}
 }

} 

当然,您必须检查event.originiframe的实际域.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有