Używanie CSS do wpływania na styl div wewnątrz iframe


Odpowiedzi:


117

Potrzebujesz JavaScript. Jest to to samo, co robienie tego na stronie nadrzędnej, z tym że musisz poprzedzić komendę JavaScript nazwą iframe.

Pamiętaj, że obowiązują te same zasady pochodzenia, więc możesz to zrobić tylko dla elementu iframe, który pochodzi z twojego serwera.

Używam frameworka Prototype , aby ułatwić:

frame1.$('mydiv').style.border = '1px solid #000000'

lub

frame1.$('mydiv').addClassName('withborder')

2
zobacz moje pytanie, to jest podobne stackoverflow.com/questions/1962707/... ale czy nie możemy zmienić stylu, jeśli ramka pochodzi z innego serwera?
Jitendra Vyas

16
To jest poprawne. Treść iframe podlega zasadom tej samej domeny. Jeśli pochodzi z Twojej domeny, możesz ją kontrolować, jeśli nie, jesteś zablokowany. Zapobiega to wszelkiego rodzaju przejmowaniu stron przez iframe.
Diodeus - James MacFarlane

2
Nie do końca rozwiązanie „tylko CSS”, ale dla mnie wystarczająco dobre. +1
Nicu Surdu

2
To nie jest CSS.
stramin

103

W skrócie nie.

Nie możesz zastosować CSS do HTML ładowanego w ramce iframe, chyba że masz kontrolę nad stroną ładowaną w ramce iframe z powodu ograniczeń zasobów między domenami.


55
To prawda, ale tak naprawdę nie pomagaj ludziom dawać przykładu
Simon Dragsbæk

czy to właśnie pojawi się w 2018 roku? Pamiętam, że kiedyś konfigurowałem styl iframe pochodzący z zewnątrz. Próbowałem zastosować css do elementu iframe renderowanego przez skrypt, ale nadal nie działa. L
Võ Minh

46

Tak. Spójrz na ten inny wątek, aby uzyskać szczegółowe informacje: Jak zastosować CSS do iframe?

var cssLink = document.createElement("link");
cssLink.href = "style.css";  
cssLink.rel = "stylesheet";  
cssLink.type = "text/css";  
frames['frame1'].document.body.appendChild(cssLink); 

4
czy frame1 jest identyfikatorem iframe?
Toni Michel Caubet

5
Tak, frame1 jest identyfikatorem iframe.
Eugene Rosenfeld,

3
To nie jest CSS.
stramin

4
nie możemy tego zrobić, jeśli ładujemy inną domenę w ramce iframe.
Saga Sunith

frame1to nazwa iframe, a nie ID
joseantgv

14

Możesz pobrać zawartość iframepierwszego, a następnie jQueryjak zwykle użyć przeciwko nim selektorów.

$("#iframe-id").contents().find("img").attr("style","width:100%;height:100%")

$("#iframe-id").contents().find("img").addClass("fancy-zoom")

$("#iframe-id").contents().find("img").onclick(function(){ zoomit($(this)); });

Powodzenia!


11
nie działa: Nieprzechwycony DOMException: Nie można odczytać właściwości „contentDocument” z „HTMLIFrameElement”: Zablokowano ramce z początkiem „ HOST ” dostęp do ramki krzyżowej.
tubbo

@tubbo, w twoim przypadku nie możesz osadzać nieautoryzowanych stron, którym nie można zapobiec z XSS. To jest tylko dla tych, którzy szukają własnych problemów, a nie hakerów: p
Riyaz Hameed

10

Szybka odpowiedź brzmi: nie, przepraszam.

Nie jest możliwe użycie tylko CSS. Zasadniczo musisz mieć kontrolę nad treścią iframe, aby nadać jej styl. Istnieją metody wykorzystujące javascript lub wybrany przez Ciebie język internetowy (o którym trochę czytałem, ale nie znam się), aby dynamicznie wstawiać niektóre potrzebne style, ale potrzebujesz bezpośredniej kontroli nad zawartością iframe, którą brzmi jak ty nie masz.


8

Użyj Jquery i poczekaj, aż źródło zostanie załadowane. Oto jak osiągnąłem (Używając interwału kątowego, możesz użyć metody setInterval javascript):

var addCssToIframe = function() {
    if ($('#myIframe').contents().find("head") != undefined) {
        $('#myIframe')
                .contents()
                .find("head")
                .append(
                        '<link rel="stylesheet" href="app/css/iframe.css" type="text/css" />');
        $interval.cancel(addCssInterval);
    }
};
var addCssInterval = $interval(addCssToIframe, 500, 0, false);

1
dlaczego nie używasz zdarzenia załadowanego iframe?
ProllyGeek

3

prawdopodobnie nie tak, jak myślisz. iframe musiałby również <link>w pliku css. I nie możesz tego zrobić nawet z javascript, jeśli jest w innej domenie.


Czy możesz podać przykład, jak to zrobić? Masz na myśli coś takiego <iframe src="/source" link=css-stylesheet:"/css.css">?
Ant

3

Najwyraźniej można to zrobić za pomocą jQuery:

$('iframe').load( function() {
    $('iframe').contents().find("head")
      .append($("<style type='text/css'>  .my-class{display:none;}  </style>"));
});

https://stackoverflow.com/a/13959836/1625795


3
Nie możesz już tego używać z powodu tej samej zasady pochodzenia w przeglądarce Chrome. Komunikat o błędzie:Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
Mohammad AlBanna

@adamj, Czy możemy zmienić arkusz stylów zastępowania elementu iframe? jeśli tak, uprzejmie dodaj skrypt.
Super Model,

2

Rodzaj hackerskiego sposobu robienia rzeczy jest taki, jak powiedział Eugene. Skończyło się na tym, że podążyłem za jego kodem i linkowałem do mojego niestandardowego CSS strony. Problemem było dla mnie to, że przy osi czasu Twittera musisz zrobić trochę bocznego śledzenia Twittera, aby zastąpić ich kod smidgen. Teraz mamy toczącą się oś czasu z naszym css do niej, IE Większa czcionka, odpowiednia wysokość linii i ukrywanie paska przewijania dla wysokości większych niż ich ograniczenia.

var c = document.createElement('link');
setTimeout(frames[0].document.body.appendChild(c),500); // Mileage varies by connection. Bump 500 a bit higher if necessary

1

Wystarczy dodać to i wszystko działa dobrze:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">

Nie jestem pewien, czy to poprawna odpowiedź na zadane pytanie, ale było to świetne rozwiązanie, aby zmienić rozmiar formularza Google na szerokość urządzenia, wielkie dzięki!
shiftyscales

0

Tak, jest to możliwe, choć uciążliwe. Musisz wydrukować / powtórzyć kod HTML strony w treści strony, a następnie zastosować funkcję zmiany reguły CSS. Korzystając z tych samych przykładów, które podano powyżej, zasadniczo użyłbyś metody parsowania, aby znaleźć div na stronie, a następnie zastosować CSS, a następnie ponownie wydrukować / wysłać echo użytkownikowi końcowemu. Nie potrzebuję tego, więc nie chcę zakodować tej funkcji w każdym elemencie CSS innej strony internetowej, żeby to zrobić.

Bibliografia:


Pytanie dotyczy w szczególności „tylko CSS”. Mając to na uwadze, twoja odpowiedź jest błędna.
Serj Sagan,

To nie jest CSS.
stramin

0

Łącząc różne rozwiązania, to działało dla mnie.

$(document).ready(function () {
    $('iframe').on('load', function() {
        $("iframe").contents().find("#back-link").css("display", "none");
    }); 
});

-1

Niemożliwe ze strony klienta. Zostanie zgłoszony błąd javascript „Błąd: odmowa dostępu do właściwości„ dokumentu ””, ponieważ element iframe nie jest częścią domeny. Jedynym rozwiązaniem jest pobranie strony z kodu po stronie serwera i zmiana wymaganego CSS.


2
Ta odpowiedź jest poprawna w swojej treści, ale dotyczy JavaScript, natomiast pytanie dotyczy CSS. Odpowiedź może być taka, że ​​musisz używać JavaScript, ale tego nie mówisz. Odpowiedź zakłada również, że treść w ramce iFrame pochodzi z innej domeny, co nie zawsze ma miejsce. Wreszcie dokładny komunikat różni się w zależności od przeglądarki.
pwdst
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.