Introduction

Working with iframes in Angular involves embedding external content within your Angular component. You can do this by using the <iframe> HTML element. Additionally, you can control and interact with the iframe from your Angular component if needed. Below are steps to integrate and work with iframes in an Angular application.

1. Basic Setup

First, create a new Angular component if you don't have one already.

JavaScript
ng generate component iframe-example

2. Embed an Iframe

You can embed an iframe in the component template. Here is a simple example to embed an external website:

iframe-example.component.html

HTML / XML
<div class="iframe-container">
  <iframe [src]="iframeUrl" width="100%" height="600px"></iframe>
</div>

iframe-example.component.ts

JavaScript
import { Component } from '@angular/core';
@Component({
  selector: 'app-iframe-example',
  templateUrl: './iframe-example.component.html',
  styleUrls: ['./iframe-example.component.css']
})
export class IframeExampleComponent {
  iframeUrl: string = 'https://www.example.com';
}

3. Dynamic Iframe URLs

You might want to load different URLs dynamically. You can bind the src attribute to a property in your component:

iframe-example.component.html

HTML / XML
<div class="iframe-container">
  <iframe [src]="iframeUrl" width="100%" height="600px"></iframe>
</div>
<button (click)="loadUrl('https://www.example.com')">Load Example</button>
<button (click)="loadUrl('https://www.angular.io')">Load Angular</button>

iframe-example.component.ts

JavaScript
import { Component, Sanitizer, SecurityContext } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
@Component({
  selector: 'app-iframe-example',
  templateUrl: './iframe-example.component.html',
  styleUrls: ['./iframe-example.component.css']
})
export class IframeExampleComponent {
  iframeUrl: any;
  constructor(private sanitizer: DomSanitizer) {
    this.iframeUrl = this.sanitizer.bypassSecurityTrustResourceUrl('https://www.example.com');
  }
  loadUrl(url: string) {
    this.iframeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);
  }
}

4. Styling the Iframe

You can add styles to the iframe to ensure it fits well within your layout:

iframe-example.component.css

CSS
.iframe-container {
  position: relative;
  width: 100%;
  height: 600px;
}
iframe {
  border: none;
  width: 100%;
  height: 100%;
}

5. Interacting with the Iframe

Interacting with the iframe content can be more complex, especially when dealing with different domains due to security constraints (same-origin policy). Here’s an example of how you can post a message to the iframe:

iframe-example.component.html

HTML / XML
<div class="iframe-container">
  <iframe #myIframe [src]="iframeUrl" width="100%" height="600px"></iframe>
</div>
<button (click)="sendMessage()">Send Message</button>

iframe-example.component.ts

JavaScript
import { Component, ViewChild, ElementRef } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
@Component({
  selector: 'app-iframe-example',
  templateUrl: './iframe-example.component.html',
  styleUrls: ['./iframe-example.component.css']
})
export class IframeExampleComponent {
  @ViewChild('myIframe', { static: false }) myIframe: ElementRef;
  iframeUrl: any;

  constructor(private sanitizer: DomSanitizer) {
    this.iframeUrl = this.sanitizer.bypassSecurityTrustResourceUrl('https://www.example.com');
  }
  sendMessage() {
    const iframeWindow = this.myIframe.nativeElement.contentWindow;
    iframeWindow.postMessage('Hello from Angular', '*');
  }
}

In the iframe content (if you control it), you can listen for messages:

Content inside the iframe (example.com).

JavaScript
window.addEventListener('message', (event) => {
  console.log('Message received from parent:', event.data);
});

6. Handling messages from the Iframe

You can also listen to messages sent from the iframe to your Angular application:

iframe-example.component.ts

JavaScript
import { Component, HostListener } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
@Component({
  selector: 'app-iframe-example',
  templateUrl: './iframe-example.component.html',
  styleUrls: ['./iframe-example.component.css']
})
export class IframeExampleComponent {
  iframeUrl: any;

  constructor(private sanitizer: DomSanitizer) {
    this.iframeUrl = this.sanitizer.bypassSecurityTrustResourceUrl('https://www.example.com');
  }
  @HostListener('window:message', ['$event'])
  onMessage(event: MessageEvent) {
    if (event.origin !== 'https://www.example.com') {
      return;
    }
    console.log('Message received from iframe:', event.data);
  }
}

Conclusion

By following these steps, you can effectively embed and interact with iframes in your Angular application. Remember to handle security concerns, such as sanitizing URLs and ensuring that message passing complies with the same-origin policy. This approach allows you to integrate external content and communicate with iframes in a seamless manner.