【问题标题】:Angular 2 iframe confusionAngular 2 iframe 混淆
【发布时间】:2017-02-28 20:43:09
【问题描述】:

我正在尝试更改 Angular 2 中 iframe 内元素的值。我尝试了很多方法,但始终无法使用 getElementById() 引用项目。我有一个测试场景适用于一种情况,而不是另一种情况,这让我更加困惑:

component.html

<iframe #iframe src="assets/test.html"></iframe>

test.html

<h1 id="wow">Wow</h1>

工作打字稿(打印&lt;h1 id="wow"&gt;Wow&lt;h1&gt;

export class MyComponent implements AfterViewInit {

    @ViewChild('iframe') iframe: ElementRef;

    ngAfterViewInit() {
        var doc = this.iframe.nativeElement.contentDocument;
        doc.open();
        doc.write('<h1 id="wow">Wow</h1>');
        doc.close();
        console.log(doc.getElementById("wow"));
    }
}

不工作的打字稿(打印null

export class MyComponent implements AfterViewInit {

    @ViewChild('iframe') iframe: ElementRef;

    ngAfterViewInit() {
        var doc = this.iframe.nativeElement.contentDocument;
        console.log(doc.getElementById("wow"));
    }
}

问题

我怎么才能让第二个正确打印元素?无论我做什么或我在test.html 中输入什么,它始终为空。

【问题讨论】:

    标签: javascript html angular iframe


    【解决方案1】:

    ngAfterViewInit()内部,很可能test.html还没有加载到iframe中。

    这可以使用iframe 上的(load)="yourLoadFunction()" 指令来颠覆,例如&lt;iframe (load)="yourLoadFunction()"&gt;&lt;/iframe&gt;

    如果您随后将代码从ngAfterViewInit() 移动到yourLoadFunction(),它应该可以正常工作。

    【讨论】:

    • 嘿 Hikmat,这正是发生的事情,这令人惊讶,因为我认为这正是 ngAfterViewInit 应该存在的......我最终在 iframe 上做的是@ 987654328@ 并将ngAfterViewInit() 调用更改为onLoad()。如果您想在答案中添加一些信息,我会很乐意接受,但目前还不够详细
    • 其实我是 Angular 2 的新手,所以对它了解不多。我试图给出一个提示,如果它对你有帮助我很高兴。
    • 啊,好直觉!当我有机会时,我会编辑您的答案以对下一个人提供更多帮助,然后接受
    • 嗨@JaronThatcher,Hikmat。这在 Chrome 中对我来说非常有用,但 IE(像往常一样)有问题:doc.close() 再次触发(load) 事件......递归。我还没有弄清楚如何在处理程序中取消订阅(load),但跳过doc.close() 似乎可行。标记 iframe 以跳过第二次加载的内容也没有奏效。
    • 这可能会有所帮助:将事件对象传递给负载处理程序(load)="yourLoadFunction($event)" 并在您的yourLoadFunction 中执行此操作:event.target.removeListener('load')
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2020-01-12
    • 1970-01-01
    • 2015-09-04
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多