【问题标题】:Enable pinch to zoom inside iframe - Ionic 2 AngularJS 2启用捏合以在 iframe 内缩放 - Ionic 2 AngularJS 2
【发布时间】:2017-06-14 01:58:40
【问题描述】:

我在标签内添加了zooming="true",但是当页面加载时,我无法缩放以增加或减少视图。我还设置了webkitallowfullscreen mozallowfullscreen allowfullscreen 来缩放页面以适应设备屏幕,但没有任何改变,页面仍然被剪切。

为了更好地解释这个概念,我以Android 原生应用为例。现在,如果您想从 Web 加载页面,请使用 WebView,结果与在 Ionic 上使用 iframe 完全相同。但是在 android 上,关于定制的事情变得更简单了:

webview.getSettings().setBuiltInZoomControls(true);

启用捏拉缩放,以及

webview.getSettings().setUseWideViewPort(true);

根据(移动)屏幕的大小调整和缩放网页。 现在,使用Windows 10 我无法构建native iOS apps,所以我必须依赖cross-platform development

这是我的detail-pagehtml:

<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);
    }

希望你能帮助我。

编辑

我添加了 document.getElementsByTagName('iframe').contentWindow.document.body.style = 'zoom:50%';,但我收到 Typescript 错误

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

这是我的整个.ts 文件:

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);
    }
}

编辑 2

&lt;iframe&gt; 中添加id="myframe" 后,我也尝试了ngAfterViewInit() 函数,但那里仍然没有变化。

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

还有这种形式:

ngAfterViewInit() {
    var iframe:HTMLIFrameElement = <HTMLIFrameElement>document.getElementById('myframe');
    var iWindow = (<HTMLIFrameElement>iframe).contentWindow.document;
    iWindow.body.style.zoom = "50%";
}

【问题讨论】:

  • 你认为这种行为只是离子还是因为iframe本身,你可以创建一个更简单的应用程序来看看问题的根源是什么。此外,如果您分享它,它可能对找到解决方案更有帮助。
  • 不知道是Ionic的限制还是iframe本身的限制。我也尝试过使用其他网址,但页面还是被剪掉了

标签: html angular iframe ionic2


【解决方案1】:

我认为在 IFrame 中是不可能的,因为这将是一个安全漏洞。 您基本上在做的是尝试从您的移动混合应用程序(在您的情况下为 Ionic 应用程序)访问网页。 它必须不允许您在该网页上运行 javascript,解决方法是禁用该浏览器上的网络安全性或在您的情况下 webview (不确定如何在移动设备中执行此操作,但这是手动浏览器自定义,因此无法在您的场景)。

关于这篇文章的更多解释 SecurityError: Blocked a frame with origin from accessing a cross-origin frame

【讨论】:

  • 简而言之,您是说我无法调整视图或至少缩小一点,对吧?这对我来说是个问题,因为我的客户想要加载其赞助广告的网页,这会导致评分不佳,因为用户必须来回滑动屏幕才能阅读每一行
  • 是的。但是为什么不创建一个在默认浏览器中打开的链接。
  • 因为我已经在我用 Android Studio 创建的应用程序的 android 版本中执行了此操作,并且它收到了不好的评价,因为用户为了加载新闻而费心打开浏览器,想知道目的是什么该应用程序的关键是如果他每次都必须加载浏览器。他们可以直接访问他们的网站,而无需使用该应用程序。在 Android 上,我设法在应用程序中加载新闻,没有人再抱怨了
  • 我猜这是您至少可以做的,或者要求您的客户制作一个更好的网页,该网页实际上响应迅速且用户友好。
  • 嗯,非常感谢您的回答。如果我将 XCode 用于 iOS 版本,我想我会克服这个问题。希望无论如何它会得到很好的评价,我会向我的客户解释这一切,也许将来也会对网站进行适当的更改。再次感谢;)
【解决方案2】:

您需要像这样跟踪手势并将缩放更改应用于 iframe document.getElementByTagName('iframe').contentWindow.document.body.style = 'zoom:50%';

此处缩放设置为 50%,但可以使用手势事件值动态添加。

【讨论】:

  • 我编辑了我的问题,以便您更好地了解我所做的事情
  • 拜托,你能帮帮我吗?没有人这样做
猜你喜欢
  • 2018-06-22
  • 2011-10-31
  • 2021-10-11
  • 1970-01-01
  • 2013-07-11
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多