Ganti gaya tubuh untuk konten dalam iframe

165

Bagaimana saya bisa mengontrol gambar latar belakang dan warna elemen tubuh dalam suatu iframe? Catatan, elemen tubuh tertanam memiliki kelas, dan iframemerupakan halaman yang merupakan bagian dari situs saya.

Alasan saya membutuhkan ini adalah bahwa situs saya memiliki latar belakang hitam yang ditetapkan untuk tubuh, dan kemudian latar belakang putih yang ditugaskan untuk div yang berisi teks. Editor WYSIWYG menggunakan iframeuntuk menanamkan konten saat mengedit, tetapi itu tidak termasuk div, sehingga teks sangat sulit dibaca.

Tubuh iframesaat di editor memiliki kelas yang tidak digunakan di tempat lain, jadi saya berasumsi ini diletakkan di sana sehingga masalah seperti ini dapat diselesaikan. Namun, ketika saya menerapkan gaya ke class.bodymereka tidak menimpa gaya yang diterapkan ke tubuh. Yang aneh adalah bahwa gaya muncul di Firebug, jadi saya tidak tahu apa yang terjadi!

Terima kasih

PEMBARUAN - Saya sudah mencoba solusi @ mikeq untuk menambahkan gaya ke kelas yang merupakan kelas tubuh. Ini tidak berfungsi ketika ditambahkan ke stylesheet halaman utama, tetapi tidak berfungsi ketika ditambahkan dengan Firebug. Saya berasumsi ini karena Firebug diterapkan ke semua elemen pada halaman sedangkan CSS tidak diterapkan dalam iframe. Apakah ini berarti menambahkan css setelah memuat jendela dengan JavaScript akan berhasil?

jd6699
sumber
1
Kemungkinan rangkap dari Bagaimana cara menerapkan CSS ke iframe?
2540625
Meskipun tidak mungkin menyentuh apa pun dalam iframe, memuat URL itu per Ajax ke <div>kaleng kadang-kadang menjadi solusi (jika diberi CORS-Header memungkinkan untuk itu) ... ... (dan "membersihkan" data yang dimuat dengan regexp pada ya, semua sudah rusak ...)
Frank Nocke
Anda dapat menggunakan javascript jika domain halaman cocok, tetapi mengapa tidak hanya menempatkan blok gaya di HTML halaman dalam Anda untuk mengganti warna yang ingin Anda ubah? Cukup tambahkan lebih banyak penyeleksi pada override Anda atau gunakan penting! jika semuanya gagal, untuk menimpa gaya warna apa pun yang Anda inginkan hanya pada satu halaman itu ...
OG Sean

Jawaban:

111

Iframe adalah 'lubang' di halaman Anda yang menampilkan halaman web lain di dalamnya. Isi iframe tidak dalam bentuk apa pun atau bagian dari halaman induk Anda.

Seperti yang telah dinyatakan orang lain, opsi Anda adalah:

  • berikan file yang sedang dimuat di iframe CSS yang diperlukan
  • Jika file di iframe berasal dari domain yang sama dengan orang tua Anda, maka Anda dapat mengakses DOM dokumen di iframe dari orang tua.
DA.
sumber
251

Di bawah ini hanya berfungsi jika konten iframe berasal dari domain induk yang sama.

Skrip jquery berikut berfungsi untuk saya. Diuji pada Chrome dan IE8. Iframe bagian dalam mereferensikan halaman yang berada di domain yang sama dengan halaman induk.

Dalam kasus khusus ini, saya menyembunyikan elemen dengan kelas tertentu di iframe batin.

Pada dasarnya, Anda hanya menambahkan elemen 'style' ke 'head' iframe bagian dalam.

$('iframe').load( function() {
    $('iframe').contents().find("head")
      .append($("<style type='text/css'>  .my-class{display:none;}  </style>"));
});
SimpleSam5
sumber
4
@ SimpleSam5 Bisakah Anda memberikan alternatif Javascript (tanpa menggunakan Jquery)?
Kamalakannan J
1
@sincerekamal Inilah kode tanpa perlu jQuery: jsfiddle.net/9g9wkpon Anda hanya perlu tahu bahwa properti CSS ditulis dgn tanda penghubung ditulis dalam camelCase dalam JavaScript, seperti dalam contoh saya. :)
Dennis98
2
jquery.js? ver = 1.12.4: 2 DOMException yang tidak tertangkap: Gagal membaca properti 'contentDocument' dari 'HTMLIFrameElement': Memblokir bingkai dengan asal " xxxxxxxxx.com " dari mengakses bingkai asal-silang.
Alex Stanese
2
@AlexStanese sebagai status jeremy, ini hanya berfungsi jika halaman iframe berasal dari server yang sama dengan halaman induk ... yang biasanya berarti Anda tidak perlu repot dengan javascript lagi ... cukup tambahkan CSS ke halaman lain di tempat pertama.
DA.
@KamalakannanJ Anda bahkan tidak perlu menggunakan Javascript. Cukup edit halaman yang ada di iFrame dan letakkan CSS di sana.
DA.
25

Anda tidak dapat mengubah gaya halaman yang ditampilkan dalam iframe kecuali Anda memiliki akses langsung dan dengan demikian kepemilikan html sumber dan / atau file css.

Ini untuk menghentikan XSS (Cross Site Scripting)

Myles Grey
sumber
Apa yang Anda maksud dengan 'akses langsung'? Halaman di iframe berasal dari situs saya, semuanya adalah satu domain.
jd6699
2
Maka Anda perlu mengubah file sumber di situs Anda (Anda tidak dapat mengubah konten apa pun di iframe) - jadi jika iframe menunjuk ke mysite.com/test.html maka Anda perlu memodifikasi test.html secara langsung .. .
Myles Gray
1
Tidak bisa? Dalam kondisi OP mengatakan Anda bisa. Misalnya, URL iframe batinnya sama dengan situs induknya sehingga ia harus dapat mengakses DOM ok dengan rasa javascript yang Anda sukai ...
OG Sean
@Myles Grey Wrong. Anda dapat memodifikasi konten dalam iframe dari halaman induknya jika berada di domain yang sama, baik dengan JavaScript maupun CSS.
Kevin M
8

An iframememiliki ruang lingkup lain, jadi Anda tidak dapat mengaksesnya ke gaya atau mengubah kontennya dengan javascript.

Ini pada dasarnya "halaman lain".

Satu-satunya hal yang dapat Anda lakukan adalah mengedit CSS-nya sendiri, karena dengan CSS global Anda, Anda tidak dapat melakukan apa-apa.

Alessandro Vendruscolo
sumber
Ya Anda bisa, dengan javascript. Perhatikan ini berfungsi paling baik dengan URL iframe dan URL induk yang berbagi domain yang sama. Tapi, saya pikir Anda benar dalam menunjukkan ini bisa dilakukan dengan CSS pada halaman di dalam iframe.
OG Sean
8

Timpa CSS domain lain iframe

Dengan menggunakan bagian dari jawaban SimpleSam5 , saya mencapai ini dengan beberapa iframe obrolan Tawk ( antarmuka penyesuaian mereka baik-baik saja tetapi saya perlu penyesuaian lebih lanjut).

Dalam iframe khusus ini yang muncul di perangkat seluler, saya harus menyembunyikan ikon default dan menempatkan salah satu gambar latar belakang saya. Saya melakukan yang berikut:

Tawk_API.onLoad = function() {
// without a specific API, you may try a similar load function
// perhaps with a setTimeout to ensure the iframe's content is fully loaded
  $('#mtawkchat-minified-iframe-element').
    contents().find("head").append(
     $("<style type='text/css'>"+
       "#tawkchat-status-text-container {"+
         "background: url(https://example.net/img/my_mobile_bg.png) no-repeat center center blue;"+
         "background-size: 100%;"+
       "} "+
       "#tawkchat-status-icon {display:none} </style>")
   );
};

Saya tidak memiliki domain Tawk apa pun dan ini berfungsi untuk saya, jadi Anda dapat melakukan ini bahkan jika itu bukan dari domain induk yang sama (terlepas dari komentar Jeremy Becker tentang jawaban Sam).

CPHPython
sumber
18
Saya menduga ini hanya berhasil karena orang-orang di Tawk telah secara eksplisit mengizinkannya.
Lawyerson
@ CPHPython Mungkin Anda bisa membantu saya. Lihat ini: stackoverflow.com/questions/60923168/…
Success Man
7

Kode ini menggunakan JavaScript vanilla. Itu menciptakan <style>elemen baru . Ini menetapkan konten teks elemen itu menjadi string yang berisi CSS baru. Dan itu menambahkan elemen itu langsung ke kepala dokumen iframe.

var iframe = document.getElementById('the-iframe');
var style = document.createElement('style');
style.textContent =
  'body {' +
  '  background-color: some-color;' +
  '  background-image: some-image;' +
  '}' 
;
iframe.contentDocument.head.appendChild(style);
2540625
sumber
7
Blocked a frame with origin xxxxxxxxx from accessing a cross-origin frame.Saya khawatir itu tidak akan berhasil
Mike
1

Jika Anda memiliki kendali atas halaman yang meng-host iframe dan halaman iframe, Anda dapat meneruskan parameter kueri ke iframe ...

Berikut adalah contoh untuk menambahkan kelas ke iframe berdasarkan apakah situs hosting itu mobile atau tidak ...

Menambahkan iFrame:

var isMobile=$("mobile").length; //detect if page is mobile
var iFrameUrl ="https://myiframesite/?isMobile=" + isMobile; 

$(body).append("<div id='wrapper'><iframe src=''></iframe></div>");
$("#wrapper iframe").attr("src", iFrameUrl ); 

Di dalam iFrame:

//add mobile class if needed
var url = new URL(window.location.href);
var isMobile = url.searchParams.get("isMobile");
if(isMobile == "1") {
    $("body").addClass("mobile");
}
Ben
sumber
Mungkin Anda bisa membantu saya. Lihat ini: stackoverflow.com/questions/60923168/…
Success Man
0

Saya memiliki blog dan saya memiliki banyak kesulitan mencari tahu cara mengubah ukuran inti tertanam saya. Manajer pos hanya memungkinkan Anda menulis teks, menempatkan gambar, dan menyematkan kode HTML. Tata letak blog itu sendiri responsif. Itu dibangun dengan Wix. Namun, HTML yang disematkan tidak. Saya membaca banyak tentang bagaimana tidak mungkin untuk mengubah ukuran komponen di dalam tubuh iFrames yang dihasilkan. Jadi, inilah saran saya:

Jika Anda hanya memiliki satu komponen di dalam iFrame Anda, yaitu inti Anda, Anda hanya dapat mengubah ukuran inti. Lupakan iFrame.

Saya punya masalah dengan viewport, tata letak khusus untuk agen pengguna yang berbeda dan inilah yang memecahkan masalah saya:

<script language="javascript" type="text/javascript" src="https://gist.github.com/roliveiravictor/447f994a82238247f83919e75e391c6f.js"></script>

<script language="javascript" type="text/javascript">

function windowSize() {
  let gist = document.querySelector('#gist92442763');

  let isMobile = {
    Android: function() {
        return /Android/i.test(navigator.userAgent)
    },
    BlackBerry: function() {
        return /BlackBerry/i.test(navigator.userAgent)
    },
    iOS: function() {
        return /iPhone|iPod/i.test(navigator.userAgent)
    },
    Opera: function() {
        return /Opera Mini/i.test(navigator.userAgent)
    },
    Windows: function() {
        return /IEMobile/i.test(navigator.userAgent) || /WPDesktop/i.test(navigator.userAgent)
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

  if(isMobile.any()) {
    gist.style.width = "36%";
    gist.style.WebkitOverflowScrolling = "touch"
    gist.style.position = "absolute"
  } else {
    gist.style.width = "auto !important";
  }
}

windowSize();

window.addEventListener('onresize', function() {
    windowSize();
});

</script>

<style type="text/css">

.gist-data {
  max-height: 300px;
}

.gist-meta {
  display: none;
}

</style>

Logikanya adalah untuk mengatur inti (atau komponen Anda) css berdasarkan agen pengguna. Pastikan untuk mengidentifikasi komponen Anda terlebih dahulu, sebelum mendaftar ke pemilih kueri. Silakan melihat bagaimana responsif bekerja .

Victor R. Oliveira
sumber
-3

Mungkin sudah berubah sekarang, tapi saya telah menggunakan stylesheet terpisah dengan elemen ini:

.feedEkList iframe
{
max-width: 435px!important;
width: 435px!important;
height: 320px!important;
}

untuk berhasil memasang youtube iframe dengan gaya ... lihat posting blog di halaman ini .

Tim Jackson
sumber
4
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
Shaiful Islam
4
Ini hanya berlaku untuk elemen iFrame itu sendiri - pertanyaannya menanyakan secara khusus tentang konten iFrame, yang saat ini tidak mungkin untuk diubah melalui CSS saja.
pwdst
@ShaifulIslam yang persis seperti yang terjadi. Rending Tims menjawab tidak berguna.
Alex Foxleigh
-23

berikan tubuh halaman iframe Anda ID (atau kelas jika Anda mau)

<html>
<head></head>
<body id="myId">
</body>
</html>

kemudian, juga di dalam halaman iframe, tetapkan latar belakang untuk itu dalam CSS

#myId {
    background-color: white;
}
mikeq
sumber
Ini aneh. Solusi Anda berfungsi untuk saya ketika saya menambahkannya ke halaman dengan firebug, tetapi tidak berfungsi jika itu ada di file css normal halaman. Mungkinkah ini bagian dari komentar Anda 'dengan asumsi halaman dalam iFrame adalah milik Anda untuk diedit'? Saya tidak mengerti apa yang Anda maksud dengan itu. Terima kasih
jd6699
Maksud saya, apakah halaman yang Anda muat ke dalam iFrame dari situs Anda dan di bawah kendali Anda? atau apakah itu dari situs eksternal yang Anda tidak dapat mengedit sumber untuk menyertakan id / kelas itu.
mikeq
Itu dari situs saya, tetapi seperti yang dilakukan oleh editor itu tidak akan mudah untuk mengubah tanda yang ditarik.
jd6699
ps saya tidak bermaksud menambahkan id = "myId" ke halaman utama Anda, tetapi ke halaman dalam iFrame. Dengan begitu Anda dapat menargetkan isi halaman iFrame dengan gaya yang berbeda dengan halaman utama Anda. Anda juga mereferensikan file CSS di halaman iFrame Anda juga bukan. Anda perlu memperlakukan halaman yang dimuat dalam iFrame sebagai halaman yang sepenuhnya independen. Jika Anda hanya memuat halaman itu ke dalam browser web apakah itu memiliki gaya yang benar?
mikeq
Saya tidak benar-benar yakin di mana 'halaman' itu karena bukan seluruh halaman yang digunakan editor. Terima kasih atas bantuan Anda, saya pikir saya mengerti bagaimana semua ini bekerja, noe.
jd6699