2017-01-28 46 views
28

Dodałem zooming="true" do tagu, ale po załadowaniu strony nie mogę powiększyć, aby zwiększyć lub zmniejszyć widok. Ustawiłem też webkitallowfullscreen mozallowfullscreen allowfullscreen, aby przeskalować stronę, aby dopasować ją do ekranu urządzenia, ale nic się nie zmieniło i strona jest nadal odcięta.Włącz szczypanie, aby powiększyć wewnątrz elementu iframe - Ionic 2 AngularJS 2

Aby nieco lepiej wytłumaczyć tę koncepcję, biorę na przykład aplikacje natywne w postaci Android. Teraz, jeśli chcesz wczytać stronę z Internetu, użyjesz WebView, a wynik jest dokładnie taki sam jak przy użyciu iframe na Ionic. Ale na Androidzie rzeczy stają się prostsze dotyczące personalizacji:

webview.getSettings().setBuiltInZoomControls(true); 

włączyć pinch-to-zoom, a

webview.getSettings().setUseWideViewPort(true); 

aby pasowały i skalowanie strony internetowej w zależności od wielkości ekranu (mobilnej). Teraz, używając Windows 10, nie mogę zbudować native iOS apps, więc muszę polegać na cross-platform development.

Oto mój 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); 
    } 

Spodziewać się można mi pomóc.

Edit

dodałem document.getElementsByTagName('iframe').contentWindow.document.body.style = 'zoom:50%'; ale Dostaję błąd maszynopis:

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

Oto mój cały .ts file:

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

Edycja 2

Po dodaniu id="myframe" do wnętrza próbowałem również z funkcją ngAfterViewInit(), ale wciąż nie wprowadzono żadnych zmian.

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

iw tej formie TOO:

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

Czy uważasz, że to zachowanie jest tylko jonowe lub z powodu samego iframe, można stworzyć prostszą aplikację aby zobaczyć, co jest źródłem problemu. Również, jeśli go udostępnisz, może być bardziej pomocny w znalezieniu rozwiązania. –

+0

Nie wiem, czy jest to ograniczenie jonowe, czy ograniczenie samego elementu iframe. Próbowałem zostały również z innych adresów URL, ale strona dostaje cięcia i tak – Pier

Odpowiedz

6

Myślę, że nie można tego zrobić w ramce IFrame, ponieważ będzie to wada bezpieczeństwa. to, co zasadniczo robisz, to próba uzyskania dostępu do strony internetowej z mobilnej aplikacji hybrydowej (aplikacja Ionic w twoim przypadku). nie musi pozwalają na wykonywanie kodu JavaScript na tej stronie internetowej, obejście będzie poprzez wyłączenie bezpieczeństwa internetowego na tej przeglądarce lub w przypadku WebView (nie wiem jak to zrobić w telefonii komórkowej, ale to jest instrukcja dostosowywanie przeglądarki tak nie będzie działać w twój scenariusz).

więcej wyjaśnień na temat tego postu SecurityError: Blocked a frame with origin from accessing a cross-origin frame

+0

Tak w kilku słowach, to mówią, że nie mogę zrobić nic, aby dostosować widok lub przynajmniej pomniejszyć trochę, prawda? To jest problem dla mnie, bo mój klient chce, aby załadować swoją stronę internetową, gdzie reklama jest sponsorowany i to prowadzi do złych ocen, ponieważ użytkownik musi przesunąć ekran iz powrotem w celu odczytania każdej linii – Pier

+0

tak. ale dlaczego nie utworzysz linku do otwarcia w domyślnej przeglądarce. – Ankit

+0

Bo ja już to zrobił w android wersji aplikacji stworzyłem z Android Studio i otrzymał złych ocen, ponieważ użytkownik został chciało się otworzyć przeglądarkę, aby załadować wiadomości, zastanawiając się, jaki jest cel tej aplikacji było gdyby miał ładować przeglądarkę za każdym razem. Mogli bezpośrednio przejść do swojej witryny bez korzystania z aplikacji. Kiedy na Androida udało mi się załadować wiadomości w aplikacji, nikt nie skarżył się już – Pier

7

Trzeba będzie śledzić ten gest i zastosować zmianę powiększenia do iframe jak ten document.getElementByTagName('iframe').contentWindow.document.body.style = 'zoom:50%';

Tutaj zoom jest ustawiony na 50%, ale można to dodać dynamicznie za pomocą wartości zdarzeń gestów.

+0

edytowany moje pytanie tak będziesz lepiej widzieć, co zrobiłem – Pier

+0

Proszę, możesz mi pomóc? Nikt inny nie – Pier