Habilitar pellizcar para hacer zoom dentro de iframe-Ionic 2 AngularJS 2


Agregué zooming="true" dentro de la etiqueta, pero cuando se carga la página no puedo hacer zoom para aumentar o disminuir la vista. También he configurado webkitallowfullscreen mozallowfullscreen allowfullscreen para escalar la página con el fin de adaptarse a la pantalla del dispositivo, pero nada cambió y la página todavía se corta.

Para explicar este concepto un poco mejor tomo por ejemplo Android aplicaciones nativas. Ahora, si desea cargar una página desde la web, use un WebView y el resultado es exactamente igual que usar un iframe en Ionic. Pero en Android las cosas se vuelven más simples con respecto a personalización:

webview.getSettings().setBuiltInZoomControls(true);

Para habilitar pellizcar para zoom, y

webview.getSettings().setUseWideViewPort(true);

Para ajustar y escalar la página web en función del tamaño de la pantalla (móvil). Ahora, usando Windows 10 no es posible para mí construir native iOS apps así que tengo que confiar en cross-platform development.

Aquí está mi detail-page: html:

<ion-content>
  <iframe sandbox class="link" frameborder="0" [src]="webPage()" zooming="true" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
</ion-content>

scss:

detail-page {

    .scroll-content{
        padding: 0px ;
    }

    ::-webkit-scrollbar,
    *::-webkit-scrollbar {
        display: none;
    }

    iframe.link {
        width: 100%;
        height: 100%;
        max-width: 100%;
        max-height: 100%;
    }

}

ts:

webPage() {
        return this.sanitizer.bypassSecurityTrustResourceUrl(this.entry.getElementsByTagName('link')[0].textContent);
    }

Espero que puedas ayudarme.

Editar

He añadido document.getElementsByTagName('iframe').contentWindow.document.body.style = 'zoom:50%'; pero estoy recibiendo un error Typescript:

Typescript Error
Property 'contentWindow' does not exist on type 'NodeListOf<HTMLIFrameElement>'.

Aquí está todo mi .ts archivo:

export class DetailPage {

    entry:any = [];

    constructor(private sanitizer: DomSanitizer, public nav: NavController, navParams:NavParams) {
        console.log('run');
        this.nav = nav;
        this.entry = navParams.get('selectedEntry');
        console.log('My entry is: "'+ this.entry.getElementsByTagName('title')[0].textContent + '"');

        document.getElementsByTagName('iframe').contentWindow.document.body.style = 'zoom:50%';
    }

    webPage() {
        return this.sanitizer.bypassSecurityTrustResourceUrl(this.entry.getElementsByTagName('link')[0].textContent);
    }
}

Editar 2

Después de agregar id="myframe" dentro de <iframe> también he intentado con la función ngAfterViewInit() pero todavía no hay cambios allí.

ngAfterViewInit() {
  var x = document.getElementById("myframe");
  var y = (<HTMLIFrameElement> x).contentWindow.document;
  y.body.style.zoom = "50%";
}

Y en esta forma también:

ngAfterViewInit() {
    var iframe:HTMLIFrameElement = <HTMLIFrameElement>document.getElementById('myframe');
    var iWindow = (<HTMLIFrameElement>iframe).contentWindow.document;
    iWindow.body.style.zoom = "50%";
}
Author: Pier, 2017-01-28

2 answers

Creo que no es posible hacerlo en un IFrame ya que será un defecto de seguridad. lo que básicamente estás haciendo es intentar acceder a una página web desde tu aplicación híbrida móvil (Ionic App en tu caso). no debe permitirle ejecutar javascript en esa página web, su solución será deshabilitar la seguridad web en ese navegador o en su caso webview (no estoy seguro de cómo hacerlo en el móvil, pero eso es la personalización manual del navegador, por lo que no funcionará en su escenario).

Más explicación sobre esto post SecurityError: Bloqueó un marco con origen para que no acceda a un marco de origen cruzado

 6
Author: Ankit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:09

Deberá realizar un seguimiento del gesto y aplicar el cambio de zoom al iframe de esta manera document.getElementByTagName('iframe').contentWindow.document.body.style = 'zoom:50%';

Aquí el zoom se establece en 50%, pero esto se puede agregar dinámicamente usando los valores de evento de gesto.

 7
Author: Vinit Sarvade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-05 14:39:45