İframe içindeki div stilini etkilemek için CSS kullanma


Yanıtlar:


117

JavaScript'e ihtiyacınız var. Üst komut sayfasında yapmakla aynıdır, ancak JavaScript komutunuza iframe adının önüne ön ek eklemeniz gerekir.

Unutmayın, aynı başlangıç ​​politikası geçerlidir, böylece bunu yalnızca kendi sunucunuzdan gelen bir iframe öğesine yapabilirsiniz.

Bunu kolaylaştırmak için Prototip çerçevesini kullanıyorum :

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

veya

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

2
bu soruma bakın stackoverflow.com/questions/1962707/… ama çerçeve başka bir sunucudaysa stili değiştiremez miyiz?
Jitendra Vyas

16
Bu doğru. Iframe içeriği aynı alan adı politikasına tabidir. Alan adınızdaysa, kontrol edebilirsiniz, eğer değilse kilitlenirsiniz. Bu, her türlü Iframe tabanlı sayfa ele geçirmesini önler.
Diodeus - James MacFarlane

2
Tam olarak bir "sadece CSS" çözümü değil, benim için yeterince iyi. +1
Nicu Surdu

2
Bu CSS değil.
stramin

103

Kısacası hayır.

Etki alanları arası kaynak kısıtlamaları nedeniyle iframe'e yüklenen sayfa üzerinde denetiminiz yoksa, iframe'de yüklenen HTML'ye CSS uygulayamazsınız.


55
Bu doğrudur, ancak insanların nasıl yapılacağına bir örnek vermelerine gerçekten yardım etmeyin
Simon Dragsbæk

bu 2018'de mi ortaya çıktı? Dışarıdan gelen iframe tarzını yapılandırdığımı hatırlıyorum. Ben komut dosyası tarafından oluşturulan iframe css uygulamak çalıştı ama stil çalışmıyor.l
Võ Minh

46

Evet. Ayrıntılar için bu diğer konuya bir göz atın: iframe'e CSS nasıl uygulanır?

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

4
frame1 iframe kimliğidir ??
Toni Michel Caubet

5
Evet, frame1, iframe'in kimliğidir.
Eugene Rosenfeld

3
Bu CSS değil.
stramin

4
iframe içine farklı bir alan yüklüyorsak bunu yapamayız.
Sunith Saga

frame1iframe adı değil, kimlik değil
joseantgv

14

Birincinin içeriğini alabilir iframeve daha sonra jQueryher zamanki gibi seçicileri kullanabilirsiniz .

$("#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)); });

İyi şanslar!


11
çalışmıyor: Yakalanmayan DOMException: 'HTMLIFrameElement' öğesinden 'contentDocument' özelliği okunamadı: " HOST " kaynağına sahip bir karenin çapraz kökenli kareye erişmesi engellendi .
tubbo

@tubbo, sizin durumunuzda, XSS'den engellenen yetkisiz siteleri yerleştiremezsiniz. Bu sadece kendi sorunlarını arayanlar içindir, hackerlar için değildir: p
Riyaz Hameed

10

Hızlı cevap: Hayır, üzgünüm.

Sadece CSS kullanmak mümkün değil. Stil oluşturmak için temel olarak iframe içeriği üzerinde kontrol sahibi olmanız gerekir. Bazı gerekli stilleri dinamik olarak eklemek için javascript veya seçtiğiniz web dilini (biraz hakkında okudum, ancak kendime aşina değilim) kullanan yöntemler var, ancak iframe içeriği üzerinde doğrudan kontrole ihtiyacınız var. senin gibi yok.


8

Jquery kullanın ve kaynak yüklenene kadar bekleyin, Ben bu şekilde başardım (Kullanılan açısal aralık, javascript setInterval yöntemini kullanabilirsiniz):

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
iframe yüklü olayı neden kullanmıyorsunuz?
ProllyGeek

3

muhtemelen düşündüğün gibi değil. iframe'in <link>de css dosyasında olması gerekir . VE farklı bir alandaysa javascript ile bile yapamazsınız.


Bunun nasıl yapılabileceğine dair bir örnek verebilir misiniz? Böyle bir şey mi demek istiyorsun <iframe src="/source" link=css-stylesheet:"/css.css">?
Karınca

3

Görünüşe göre jQuery ile yapılabilir:

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

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


3
Chrome tarayıcısındaki aynı başlangıç ​​politikası nedeniyle bunu artık kullanamazsınız. Hata mesajı:Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
Mohammad AlBanna

@adamj, iframe öğesinin üzerine yazma stil sayfasını değiştirebilir miyiz? evet ise, lütfen komut dosyası ekleyin.
Süper Model

2

Eugene'in dediği gibi, bir tür şeyleri yapmanın yolu. Kodunu takip ettim ve sayfa için özel Css'ime bağladım. Benim için sorun şuydu, bir twitter zaman çizelgesi ile bir smidgen kodlarını geçersiz kılmak için twitter biraz yan yapmak zorunda. Şimdi css, IE Büyük yazı tipi, uygun satır yüksekliği ve kaydırma çubuğunu sınırlarından daha büyük yüksekliklere gizleme ile yuvarlanan bir zaman çizelgesi var.

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

Sadece bunu ekleyin ve hepsi iyi çalışıyor:

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

Bunun verilen soruya doğru cevap olup olmadığından emin değilim, ancak google formunu cihazın genişliğine göre yeniden boyutlandırmak için harika bir çözümdü, çok teşekkürler!
shiftyscales

0

Evet, hantal olsa da mümkündür. Sayfanın HTML kodunu sayfanızın gövdesine yazdırmanız / echo yapmanız ve ardından bir CSS kuralı değiştirme işlevi uygulamanız gerekir. Yukarıda verilen aynı örnekleri kullanarak, esas olarak sayfadaki div'leri bulmak için bir ayrıştırma yöntemi kullanır ve daha sonra CSS'yi ona uygular ve ardından son kullanıcıya yeniden yazdırır / tekrarlarsınız. Ben sadece aphtply için başka bir web sayfasının CSS her öğeye bu işlevi kodlamak istemiyorum bu gerek yok.

Referanslar:


Soru özellikle "sadece CSS kullanma" sorusunu soruyor. Bunu akılda tutarak cevabınız yanlış.
Serj Sagan

Bu CSS değil.
stramin

0

Farklı çözümleri birleştirdiğimde, bu benim için işe yaradı.

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

-1

İstemci tarafından mümkün değil. Bir javascript hatası oluşacak "Hata: Iframe, doranızın bir parçası olmadığından" belge "özelliğine erişim izni reddedildi. Tek çözüm, sayfayı sunucu tarafı kodundan almak ve gerekli CSS'yi değiştirmek.


2
Bu cevap içeriğinde doğrudur ancak JavaScript CSS ile ilgilidir. Cevap, JavaScript kullanmanız gerekebilir, ancak bunu söylemezsiniz. Yanıt, iFrame'deki içeriğin her zaman böyle olmayan farklı bir etki alanından olduğunu varsayar. Son olarak, mesajın tamamı tarayıcıdan tarayıcıya değişecektir.
pwdst
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.