Ich habe eine Angular2 Anwendung iframed in Liferay Portlet. Liferay Tomcat ist in einer anderen Domäne als angular2 Anwendung. Ich versuche, iframe basierend auf der Höhe der iframed-Anwendung zu skalieren. Ich benutze dafür die Helferdatei auf dem Tomcat von Liferay - basierend auf der Antwort Resizing an iframe based on content.Angular2 Anwendung in Iframe Größesereignis eingebettet
Dies ist, was ich bisher habe: helper.html auf tomcat mit Anwendung parent:
<html>
<!--
This page is on the same domain as the parent, so can
communicate with it to order the iframe window resizing
to fit the content
-->
<body onload="parentIframeResize()">
<script>
// Tell the parent iframe what height the iframe needs to be
function parentIframeResize()
{
var height = getParam('height');
// This works as our parent's parent is on our domain..
parent.parent.resizeIframe(height);
}
// Helper function, parse param from request string
function getParam(name)
{
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp(regexS);
var results = regex.exec(window.location.href);
if(results == null)
return "";
else
return results[1];
}
</script>
</body>
</html>
JSP-Datei im Portlet mit iframe:
<iframe id="iframed-application"
src="${baseUrl}:${externalTomcatPort}/${applicationName}/iframe?baseUrl=${baseUrl}:${port}">
</iframe>
<script>
// Resize iframe to full height
function resizeIframe(height) {
document.getElementById('iframed-application').height = parseInt(height) + 10;
}
</script>
Angular2 app.component. html
<menu></menu>
<router-outlet></router-outlet>
<iframe id="helpframe" [src]='helperSource' height='0' width='0' frameborder='0'></iframe>
Angular2 app.component.ts
Wenn ngOnInit aufgerufen wird, wird die Vorlage noch nicht gerendert, also setzt sie iframe height immer auf 800px, aber die Hauptfrage ist anders. Wie kann ich das Größenänderungsereignis des Inhalts der eckigen App im iframe erkennen? Ich habe versucht zu verwenden:
@HostListener('window:resize', ['$event'])
aber es ist zu hören, die Größe des gesamten Fensters zu ändern, nicht der Iframe.
Mein zweiter Versuch war wie folgt:
let iframe: HTMLIFrameElement = <HTMLIFrameElement> document.getElementById('iframed-application');
let contentWindow: Window = iframe.contentWindow;
contentWindow.onresize = event => {
};
Aber es auch nicht, weil document.getElementById null zurückgegeben - Cross-Domain - wie ich aus Gründen der Sicherheit verstehen.
Ist es irgendwie möglich, die Größe von iframed Anwendung zu hören, oder vielleicht gibt es einen anderen Weg?