วิธีการใช้ CSS กับ iframe?


1017

ฉันมีหน้าง่าย ๆ ที่มีบางส่วน iframe (เพื่อแสดงลิงก์ RSS) ฉันจะใช้รูปแบบ CSS เดียวกันจากหน้าหลักไปยังหน้าที่แสดงใน iframe ได้อย่างไร


66
เป็นไปได้ แต่เฉพาะถ้าโดเมนของ iframe เหมือนกันกับพ่อแม่
gawpertron

13
gawpertron เพื่อชี้แจงคุณกำลังพูดว่าถ้าฉันใช้เนื้อหา iFrame จากโดเมนอื่นที่ฉันไม่ได้ควบคุมไม่มีวิธีใดที่ฉันจะควบคุม CSS สำหรับเนื้อหานั้น
Ville M

คุณช่วยลิงค์ลิ้งค์ไปที่หน้าเพื่อที่เราจะได้สามารถดูการเปลี่ยนแปลงของเราได้

5
โดเมนพอร์ตและโปรโตคอลจะต้องเหมือนกันไม่สามารถใช้งานได้กับโดเมนย่อย
lee penkman

คำตอบ:


434

แก้ไข:วิธีนี้ใช้ไม่ได้ข้ามโดเมนเว้นแต่ว่าได้ตั้งค่าส่วนหัว CORSที่เหมาะสม

มีสองสิ่งที่แตกต่างกันที่นี่: สไตล์ของบล็อก iframe และสไตล์ของเพจที่ฝังอยู่ใน iframe คุณสามารถกำหนดสไตล์ของบล็อก iframe ได้ตามปกติ:

<iframe name="iframe1" id="iframe1" src="empty.htm" 
        frameborder="0" border="0" cellspacing="0"
        style="border-style: none;width: 100%; height: 120px;"></iframe>

สไตล์ของเพจที่ฝังใน iframe จะต้องตั้งค่าโดยรวมไว้ในเพจย่อย:

<link type="text/css" rel="Stylesheet" href="Style/simple.css" />

หรือสามารถโหลดได้จากหน้าหลักด้วย Javascript:

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

30
โปรดทราบว่าสำหรับฉันดูเหมือนว่าบางตัวอย่างที่โพสต์ก่อนหน้านี้ไม่ถูกต้องสำหรับ html5 document.getElementById("myframe").contentDocumentคุณสามารถเข้าถึงเนื้อหาของเฟรมดังต่อไปนี้: การฝัง CSS ยังคงไม่เหมาะกับฉัน
Rehno Lindeque

35
ลิงก์อาจปรากฏใน HEAD เท่านั้น
Knu

18
ทำงานให้ฉันเฉพาะเมื่อฉันทำ...document.head.appendChild(cssLink)- Firefox และ Safari
mojuba

24
ใช้งานข้ามโดเมนได้จริงหรือ ฉันไม่คิดว่ามันจะ
Simon East

89
ดังนั้น no1 อื่นต้องทดสอบเพื่อค้นหา: ถูกต้องมันไม่ทำงานข้ามโดเมน ทันทีที่ทำเฟรม ['ชื่อ'] คุณจะได้รับ "ไม่ปลอดภัย JavaScript พยายามเข้าถึงเฟรมด้วย URL blah จากเฟรมด้วย URL blah โดเมนโปรโตคอลและพอร์ตต้องตรงกัน"
เควิน

205

ผมได้พบกับปัญหานี้กับGoogle Calendar ฉันต้องการจัดวางสไตล์บนพื้นหลังสีเข้มและเปลี่ยนแบบอักษร

โชคดีที่ URL จากโค้ดฝังไม่มีข้อ จำกัด ในการเข้าถึงโดยตรงดังนั้นโดยใช้ฟังก์ชั่น PHP file_get_contentsทำให้สามารถรับเนื้อหาทั้งหมดจากหน้าเว็บได้ แทนที่จะเรียกใช้ Google URL คุณสามารถเรียกไฟล์ php ที่อยู่บนเซิร์ฟเวอร์ของคุณเช่น google.phpซึ่งจะมีเนื้อหาต้นฉบับพร้อมการแก้ไข:

$content = file_get_contents('https://www.google.com/calendar/embed?src=%23contacts%40group.v.calendar.google.com&ctz=America/Montreal');

การเพิ่มเส้นทางไปยังสไตล์ชีตของคุณ:

$content = str_replace('</head>','<link rel="stylesheet" href="http://www.yourwebsiteurl.com/google.css" /></head>', $content);

(สิ่งนี้จะทำให้สไตล์ชีทของคุณอยู่ต่อหน้าheadแท็กสิ้นสุด)

ระบุ URL พื้นฐานในรูปแบบ URL ดั้งเดิมในกรณีที่ css และ js เรียกว่าค่อนข้าง:

$content = str_replace('</title>','</title><base href="https://www.google.com/calendar/" />', $content);

google.phpไฟล์สุดท้ายควรมีลักษณะดังนี้:

<?php
$content = file_get_contents('https://www.google.com/calendar/embed?src=%23contacts%40group.v.calendar.google.com&ctz=America/Montreal');
$content = str_replace('</title>','</title><base href="https://www.google.com/calendar/" />', $content);
$content = str_replace('</head>','<link rel="stylesheet" href="http://www.yourwebsiteurl.com/google.css" /></head>', $content);
echo $content;

จากนั้นคุณเปลี่ยนiframeรหัสฝังเป็น:

<iframe src="http://www.yourwebsiteurl.com/google.php" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></iframe>

โชคดี!


71
คุณสามารถเรียกการแฮ็กนั้นตามคำจำกัดความหากคุณต้องการ แต่คุณไม่ได้เสนอวิธีแก้ปัญหาที่ดีกว่านี้ ... โซลูชันนี้ไม่ใช่วิธีที่จะทำลายบริการของ Google หรือเพื่อหลอกลวงผู้คนในการใช้ประโยชน์จากจุดอ่อนของพวกเขา
SequenceDigitale.com

5
ฉันจะฆ่าเพื่อให้วิธีการแก้ปัญหานี้ทำงานร่วมกับ Google เอกสาร มันโยนข้อผิดพลาดจาวาสคริปต์ทุกประเภท "Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'a' จาก undefined"
deweydb

1
ไม่เป็นไรฉันคิดออกโพสต์โซลูชั่นที่นี่: stackoverflow.com/questions/25395279/ …
deweydb

9
@ChrisHoughton FYI โดยพื้นฐานแล้วไม่ใช่ อย่างไรก็ตามอาจทำให้ iframe ทั้งหมดไม่มีจุดหมาย (เหตุผลหนึ่งข้อสำหรับการใช้ iframe เช่นเพื่อความปลอดภัยเช่นด้วยการชำระเงินด้วยบัตรและหากคุณทำสิ่งที่แนะนำไว้ที่นี่คุณอาจทำให้เกิดปัญหากับตัวเอง)
alastair

10
คุณจะได้รับปฏิทินในฐานะผู้ใช้ที่ไม่ได้ลงชื่อเข้าใช้ ด้วย iframe html ปกติผู้ใช้จะเห็นปฏิทินส่วนตัวของพวกเขาหากพวกเขาลงชื่อเข้าใช้ google แต่เนื่องจากรหัส PHP ของคุณไม่สามารถรู้รหัสเซสชันของผู้ใช้ Google จึงไม่สามารถดึงข้อมูลปฏิทินส่วนบุคคลของพวกเขาได้
bdsl

72

หากเนื้อหาของ iframe ไม่สมบูรณ์ภายใต้การควบคุมของคุณหรือคุณต้องการเข้าถึงเนื้อหาจากหน้าต่างๆที่มีสไตล์แตกต่างกันคุณสามารถลองใช้งานโดยใช้ JavaScript

var frm = frames['frame'].document;
var otherhead = frm.getElementsByTagName("head")[0];
var link = frm.createElement("link");
link.setAttribute("rel", "stylesheet");
link.setAttribute("type", "text/css");
link.setAttribute("href", "style.css");
otherhead.appendChild(link);

โปรดทราบว่าขึ้นอยู่กับเบราว์เซอร์ที่คุณใช้สิ่งนี้อาจใช้ได้กับหน้าที่แสดงจากโดเมนเดียวกันเท่านั้น


82
อาจน่าสังเกตว่านโยบายต้นกำเนิดเดียวกันจะหยุดการทำงานนี้หากหน้านั้นอยู่ในโดเมนอื่น
ConroyP

2
ในแนวความคิดเดียวกัน แต่รวบรัดมากขึ้น: <iframe onload="this.contentDocument.body.style.overflow='hidden';" />
ป้องกันหนึ่ง

แม้แต่ Firefox ก็ใช้ CORS

59
var $head = $("#eFormIFrame").contents().find("head");

$head.append($("<link/>", {
    rel: "stylesheet",
    href: url,
    type: "text/css"
}));

@deweydb ฉันใช้กับ iframe ข้ามโดเมนโดยเฉพาะ แต่ฉันทำได้เพียงให้อภัยคุณ!
Rami Sarieddine

@ramie และคุณทดสอบในเบราว์เซอร์หลาย ๆ เบราว์เซอร์ส่วนใหญ่กำลังโยนข้อผิดพลาดด้านความปลอดภัย
deweydb

ฉันเห็นความคิดนี้มาก่อน แต่เพิ่มลิงก์ไปยังไฟล์ที่ยอดเยี่ยมและเป็นมืออาชีพ ... + ขึ้น
J.Tural

29

iframe ได้รับการจัดการในระดับสากลเหมือนกับหน้า HTML ที่แตกต่างกันโดยเบราว์เซอร์ส่วนใหญ่ หากคุณต้องการใช้สไตล์ชีทเดียวกันกับเนื้อหาของ iframe เพียงอ้างอิงจากหน้าเว็บที่ใช้ในนั้น


22
@hangry แต่ ... ได้อย่างไร
ลูกของพระเจ้า

29

นี่คือวิธีการใช้โค้ด CSS โดยตรงโดยไม่ต้องใช้<link>เพื่อโหลดสไตล์ชีทพิเศษ

var head = jQuery("#iframe").contents().find("head");
var css = '<style type="text/css">' +
          '#banner{display:none}; ' +
          '</style>';
jQuery(head).append(css);

สิ่งนี้ซ่อนแบนเนอร์ในหน้า iframe ขอขอบคุณสำหรับคำแนะนำของคุณ!


1
สิ่งนี้จำเป็นต้องมี iframe ที่มี id iframeหรือไม่?
Jeremy

1
@jmalais เพียงแทนที่#iframeด้วย#<id>หรือแม้กระทั่งiframeการเลือกทั้งหมดiframes
เซ็ป McCorkle

3
ดูเหมือนว่าจะไม่ได้ผลสำหรับฉัน iframe ที่ฉันพยายามแก้ไขยังไม่มีหัวอยู่ด้านล่างใน dom นั่นหมายความว่าฉันจำเป็นต้องเข้าถึงส่วนหัวภายในของเอกสาร html หรือว่าเป็นสิ่งที่ฟังก์ชั่นการค้นหา jquery ควรสามารถทำได้ด้วยตัวเอง?
David A. French

1
ตรวจสอบคอนโซลและดูเหมือนว่าถูกบล็อกไม่ให้เข้าถึงเนื้อหา iframe เนื่องจากโดเมนไม่ตรงกัน ฉันกำลังใช้โครมและโฮสต์สภาพแวดล้อมการพัฒนาของฉันในพื้นที่
David A. French

Uncaught DOMException: บล็อกเฟรมที่มีต้นกำเนิดมันทำให้ฉันเกิดข้อผิดพลาดนี้
priyanka patel

26

หากคุณควบคุมหน้าใน iframe ดังที่ hangy กล่าววิธีที่ง่ายที่สุดคือการสร้างไฟล์ CSS ที่ใช้ร่วมกันที่มีสไตล์ทั่วไปจากนั้นเพียงเชื่อมโยงไปยังหน้านั้นจากหน้า html ของคุณ

ไม่เช่นนั้นคุณจะไม่สามารถเปลี่ยนสไตล์ของหน้าจากหน้าภายนอกใน iframe ของคุณแบบไดนามิก เนื่องจากเบราว์เซอร์ทำให้การรักษาความปลอดภัยในการเขียนสคริปต์ cross frame dom แน่นเกินไปเนื่องจากอาจมีการปลอมแปลงและแฮ็กอื่น ๆ ในทางที่ผิด

บทช่วยสอนนี้อาจให้ข้อมูลเพิ่มเติมเกี่ยวกับการเขียนสคริปต์ iframe โดยทั่วไป เกี่ยวกับการเขียนสคริปต์ข้ามเฟรมอธิบายข้อ จำกัด ด้านความปลอดภัยจากมุมมองของ IE


19

การเปลี่ยนแปลงเล็กน้อยด้านบน:

var cssLink = document.createElement("link") 
cssLink.href = "pFstylesEditor.css"; 
cssLink.rel = "stylesheet"; 
cssLink.type = "text/css"; 

//Instead of this
//frames['frame1'].document.body.appendChild(cssLink);
//Do this

var doc=document.getElementById("edit").contentWindow.document;

//If you are doing any dynamic writing do that first
doc.open();
doc.write(myData);
doc.close();

//Then append child
doc.body.appendChild(cssLink);

ทำงานได้ดีกับ ff3 และ ie8 อย่างน้อย


7
myData คืออะไรและมาจากไหน
Tigran

1
@Tigran ใช้สำหรับdynamic data
Akash

13

หากคุณต้องการนำ CSS และ JavaScript กลับมาใช้ใหม่จากหน้าหลักบางทีคุณควรพิจารณาแทนที่<IFRAME>ด้วยเนื้อหาที่โหลด Ajax นี่คือ SEO ที่เป็นมิตรมากขึ้นในขณะนี้เมื่อบอทค้นหาสามารถเรียกใช้ JavaScript ได้

นี่คือตัวอย่างjQueryที่รวมหน้า html อื่นไว้ในเอกสารของคุณ นี้เป็นมากขึ้น SEO iframeเป็นมิตรกว่า เพื่อให้แน่ใจว่าบ็อตไม่ได้จัดทำดัชนีหน้าเว็บที่รวมไว้ให้เพิ่มเข้าไปเพื่อไม่อนุญาตrobots.txt

<html>
  <header>
    <script src="/js/jquery.js" type="text/javascript"></script>
  </header>
  <body>
    <div id='include-from-outside'></div>
    <script type='text/javascript'>
      $('#include-from-outside').load('http://example.com/included.html');
    </script> 
  </body>
</html>

คุณสามารถรวม jQuery ได้โดยตรงจาก Google: http://code.google.com/apis/ajaxlibs/documentation/ - นี่หมายถึงการรวมรุ่นที่ใหม่กว่าโดยอัตโนมัติและการเพิ่มความเร็วที่สำคัญบางอย่าง นอกจากนี้หมายความว่าคุณต้องไว้วางใจพวกเขาในการส่งมอบ jQuery;)


1
หนึ่งควรทราบว่าวิธีนี้จะไม่ทำงานหากเนื้อหาของหน้าเป็นแบบไดนามิกในทางใดทางหนึ่ง
nickdnk

12

ต่อไปนี้ใช้งานได้สำหรับฉัน

var iframe = top.frames[name].document;
var css = '' +
          '<style type="text/css">' +
          'body{margin:0;padding:0;background:transparent}' +
          '</style>';
iframe.open();
iframe.write(css);
iframe.close();

1
ข้อผิดพลาด:Uncaught TypeError: Cannot read property 'open' of undefined
KingRider

10

ขยายโซลูชัน jQuery ด้านบนเพื่อรับมือกับความล่าช้าในการโหลดเนื้อหาเฟรม

$('iframe').each(function(){
    function injectCSS(){
        $iframe.contents().find('head').append(
            $('<link/>', { rel: 'stylesheet', href: 'iframe.css', type: 'text/css' })
        );
    }

    var $iframe = $(this);
    $iframe.on('load', injectCSS);
    injectCSS();
});

1
'$ this' จะต้องเป็น '$ (นี่)' เพื่อให้สามารถใช้งานได้ ดีเมื่อเป็นเช่นนั้น :)
h.coates

9

รุ่นกะทัดรัดของฉัน:

<script type="text/javascript">
$(window).load(function () {
    var frame = $('iframe').get(0);
    if (frame != null) {
        var frmHead = $(frame).contents().find('head');
        if (frmHead != null) {
            frmHead.append($('style, link[rel=stylesheet]').clone()); // clone existing css link
            //frmHead.append($("<link/>", { rel: "stylesheet", href: "/styles/style.css", type: "text/css" })); // or create css link yourself
        }
    }   
});
</script>

อย่างไรก็ตามในบางครั้งหน้าต่างiframeยังไม่พร้อมโหลดดังนั้นจึงจำเป็นต้องใช้ตัวจับเวลาการจับเวลา

รหัสพร้อมใช้ (พร้อมตัวจับเวลา):

<script type="text/javascript">
var frameListener;
$(window).load(function () {
    frameListener = setInterval("frameLoaded()", 50);
});
function frameLoaded() {
    var frame = $('iframe').get(0);
    if (frame != null) {
        var frmHead = $(frame).contents().find('head');
        if (frmHead != null) {
            clearInterval(frameListener); // stop the listener
            frmHead.append($('style, link[rel=stylesheet]').clone()); // clone existing css link
            //frmHead.append($("<link/>", { rel: "stylesheet", href: "/styles/style.css", type: "text/css" })); // or create css link yourself
        }
    }
}
</script>

... และลิงก์ jQuery:

<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js" type="text/javascript"></script>

8

คำตอบอื่น ๆ ที่นี่ดูเหมือนจะใช้ลิงก์ jQuery และ CSS

รหัสนี้ใช้ JavaScript วานิลลา มันสร้าง<style>องค์ประกอบใหม่ มันตั้งค่าเนื้อหาข้อความขององค์ประกอบนั้นเป็นสตริงที่มี CSS ใหม่ และผนวกองค์ประกอบนั้นเข้ากับส่วนหัวของเอกสาร iframe โดยตรง

var iframe = document.getElementById('the-iframe');
var style = document.createElement('style');
style.textContent =
  '.some-class-name {' +
  '  some-style-name: some-value;' +
  '}' 
;
iframe.contentDocument.head.appendChild(style);

7

เมื่อคุณพูดว่า "doc.open ()" หมายความว่าคุณสามารถเขียนแท็ก HTML ใดก็ได้ใน iframe ดังนั้นคุณควรเขียนแท็กพื้นฐานทั้งหมดสำหรับหน้า HTML และถ้าคุณต้องการมีลิงค์ CSS ในหัว iframe ของคุณเพียงแค่เขียน iframe พร้อมลิงก์ CSS ในนั้น ฉันให้คุณตัวอย่าง:

doc.open();

doc.write('<!DOCTYPE html><html><head><meta charset="utf-8"/><meta http-quiv="Content-Type" content="text/html; charset=utf-8"/><title>Print Frame</title><link rel="stylesheet" type="text/css" href="https://stackoverflow.com/css/print.css"/></head><body><table id="' + gridId + 'Printable' + '" class="print" >' + out + '</table></body></html>');

doc.close();

7

ใช้สามารถลองนี้:

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

3
หาก iframe ของคุณมาจากแหล่งกำเนิดต่างกันกลไก CORS จะไม่อนุญาตให้มีวิธีแก้ไขปัญหานี้
นายแอนเดอร์สัน

จะเกิดอะไรขึ้นถ้า iframe-url เปิดใช้งาน CORS สำหรับทุกสถานที่
adrhc

6

คุณจะไม่สามารถจัดสไตล์เนื้อหาของ iframe ด้วยวิธีนี้ ข้อเสนอแนะของฉันคือใช้สคริปต์ฝั่งเซิร์ฟเวอร์ (PHP, ASP หรือสคริปต์ Perl) หรือค้นหาบริการออนไลน์ที่จะแปลงฟีดเป็นโค้ด JavaScript วิธีเดียวที่จะทำคือถ้าคุณสามารถทำเซิร์ฟเวอร์รวมถึง


29
ระวังเมื่อคุณพูดว่าบางสิ่งไม่สามารถทำได้ในความเป็นจริงมันเป็นเรื่องยาก
Lathan

4

ในกรณีที่คุณสามารถเข้าถึงหน้า iframe และต้องการให้ CSS อื่นนำไปใช้กับมันเฉพาะเมื่อคุณโหลดผ่าน iframe บนหน้าของคุณที่นี่ฉันพบวิธีแก้ปัญหาสำหรับสิ่งเหล่านี้

วิธีนี้ใช้ได้แม้ว่า iframe กำลังโหลดโดเมนอื่น

ตรวจสอบเกี่ยวกับ postMessage()

แผนคือส่ง CSS ไปที่ iframe เป็นข้อความเหมือน

iframenode.postMessage('h2{color:red;}','*');

* คือการส่งข้อความนี้โดยไม่คำนึงถึงโดเมนที่อยู่ใน iframe

และรับข้อความใน iframe และเพิ่มข้อความที่ได้รับ (CSS) เข้ากับส่วนหัวของเอกสารนั้น

รหัสที่จะเพิ่มในหน้า iframe

window.addEventListener('message',function(e){

    if(e.data == 'send_user_details')
    document.head.appendChild('<style>'+e.data+'</style>');

});

4

เนื่องจากมีคำตอบมากมายที่เขียนสำหรับโดเมนเดียวกันฉันจะเขียนวิธีการนี้ในโดเมนข้าม

ก่อนอื่นคุณต้องรู้ว่าPost Message APIAPI เราต้องการผู้ส่งสารเพื่อสื่อสารระหว่างสองหน้าต่าง

นี่คือผู้ส่งสารที่ฉันสร้างขึ้น

/**
 * Creates a messenger between two windows
 *  which have two different domains
 */
class CrossMessenger {

    /**
     * 
     * @param {object} otherWindow - window object of the other
     * @param {string} targetDomain - domain of the other window
     * @param {object} eventHandlers - all the event names and handlers
     */
    constructor(otherWindow, targetDomain, eventHandlers = {}) {
        this.otherWindow = otherWindow;
        this.targetDomain = targetDomain;
        this.eventHandlers = eventHandlers;

        window.addEventListener("message", (e) => this.receive.call(this, e));
    }

    post(event, data) {

        try {
            // data obj should have event name
            var json = JSON.stringify({
                event,
                data
            });
            this.otherWindow.postMessage(json, this.targetDomain);

        } catch (e) {}
    }

    receive(e) {
        var json;
        try {
            json = JSON.parse(e.data ? e.data : "{}");
        } catch (e) {
            return;
        }
        var eventName = json.event,
            data = json.data;

        if (e.origin !== this.targetDomain)
            return;

        if (typeof this.eventHandlers[eventName] === "function") 
            this.eventHandlers[eventName](data);
    }

}

การใช้สิ่งนี้ในสองหน้าต่างเพื่อสื่อสารสามารถแก้ไขปัญหาของคุณได้

ในหน้าต่างหลัก

var msger = new CrossMessenger(iframe.contentWindow, "https://iframe.s.domain");

var cssContent = Array.prototype.map.call(yourCSSElement.sheet.cssRules, css_text).join('\n');
msger.post("cssContent", {
   css: cssContent
})

จากนั้นรับเหตุการณ์จาก Iframe

ใน Iframe:

var msger = new CrossMessenger(window.parent, "https://parent.window.domain", {
    cssContent: (data) => {
        var cssElem = document.createElement("style");
        cssElem.innerHTML = data.css;
        document.head.appendChild(cssElem);
    }
})

ดูบทช่วยสอนJavascript และ Iframes ที่สมบูรณ์ สำหรับรายละเอียดเพิ่มเติม


3

ฉันพบวิธีแก้ไขปัญหาอื่นที่จะนำสไตล์ใน html หลักเช่นนี้

<style id="iframestyle">
    html {
        color: white;
        background: black;
    }
</style>
<style>
    html {
        color: initial;
        background: initial;
    }
    iframe {
        border: none;
    }
</style>

และใน iframe ให้ทำเช่นนี้ (ดู js onload)

<iframe  onload="iframe.document.head.appendChild(ifstyle)" name="log" src="/upgrading.log"></iframe>

และใน js

<script>
    ifstyle = document.getElementById('iframestyle')
    iframe = top.frames["log"];
</script>

อาจไม่ใช่วิธีที่ดีที่สุดและสามารถปรับปรุงได้อย่างแน่นอน แต่เป็นอีกตัวเลือกหนึ่งหากคุณต้องการเก็บแท็ก "สไตล์" ไว้ในหน้าต่างหลัก


3

ที่นี่มีสองสิ่งภายในโดเมน

  1. มาตรา iFrame
  2. เพจโหลดภายใน iFrame

ดังนั้นคุณต้องการจัดรูปแบบสองส่วนดังต่อไปนี้

1. สไตล์สำหรับส่วน iFrame

มันสามารถสไตล์การใช้ CSS กับที่เคารพidหรือclassชื่อ คุณสามารถจัดสไตล์ในสไตล์ชีทระดับบนได้เช่นกัน

<style>
#my_iFrame{
height: 300px;
width: 100%;
position:absolute;
top:0;
left:0;
border: 1px black solid;
}
</style>

<iframe name='iframe1' id="my_iFrame" src="#" cellspacing="0"></iframe>

2. จัดรูปแบบ Page Loaded ภายใน iFrame

สไตล์นี้สามารถโหลดได้จากหน้าหลักด้วยความช่วยเหลือของ Javascript

var cssFile  = document.createElement("link") 
cssFile.rel  = "stylesheet"; 
cssFile.type = "text/css"; 
cssFile.href = "iFramePage.css"; 

จากนั้นตั้งค่าไฟล์ CSS นั้นให้เป็นส่วนที่เกี่ยวข้องกับ iFrame

//to Load in the Body Part
frames['my_iFrame'].document.body.appendChild(cssFile); 
//to Load in the Head Part
frames['my_iFrame'].document.head.appendChild(cssFile);

ที่นี่คุณสามารถแก้ไขส่วนหัวของหน้าภายใน iFrame โดยใช้วิธีนี้ได้เช่นกัน

var $iFrameHead = $("#my_iFrame").contents().find("head");
$iFrameHead.append(
   $("<link/>",{ 
      rel: "stylesheet", 
      href: urlPath, 
      type: "text/css" }
     ));

2

เราสามารถแทรกแท็กสไตล์ลงใน iframe โพสต์ที่นี่ ...

<style type="text/css" id="cssID">
.className
{
    background-color: red;
}
</style>

<iframe id="iFrameID"></iframe>

<script type="text/javascript">
    $(function () {
        $("#iFrameID").contents().find("head")[0].appendChild(cssID);
        //Or $("#iFrameID").contents().find("head")[0].appendChild($('#cssID')[0]);
    });
</script>

1
มันใช้งานไม่ได้ ดูเหมือนว่าจะแทรกแท็กสไตล์อย่างถูกต้อง แต่ไม่มีเนื้อหาอยู่ภายในและไม่มี ID
darylknight

2

var link1 = document.createElement('link');
    link1.type = 'text/css';
    link1.rel = 'stylesheet';
    link1.href = "../../assets/css/normalize.css";
window.frames['richTextField'].document.body.appendChild(link1);


1
ฉันได้ตรวจสอบคำตอบนี้หลายครั้งสิ่งที่อยู่richTextFieldที่นี่
Kirankumar Dafda

1
มันเป็นชื่อ iframe
Jeeva

ฉันไม่ได้ลอง แต่ฉันเดาว่ามันจะไม่เกิดขึ้นกับกล่องทราย
Jeeva

1

ฉันคิดว่าวิธีที่ง่ายที่สุดคือเพิ่ม div อื่นในที่เดียวกับ iframe

ทำให้มันz-indexใหญ่กว่า iframe container ดังนั้นคุณสามารถสไตล์ของ div ของคุณได้อย่างง่ายดาย หากคุณต้องการคลิกที่มันเพียงใช้pointer-events:noneกับ div ของคุณเองดังนั้น iframe จะทำงานในกรณีที่คุณต้องการคลิกที่มัน;)

ฉันหวังว่ามันจะช่วยให้ใครบางคน;)


1

มีสคริปต์ที่ยอดเยี่ยมที่แทนที่โหนดด้วยเวอร์ชัน iframe ของตัวเอง การสาธิต CodePen

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างการใช้งาน:

// Single node
var component = document.querySelector('.component');
var iframe = iframify(component);

// Collection of nodes
var components = document.querySelectorAll('.component');
var iframes = Array.prototype.map.call(components, function (component) {
  return iframify(component, {});
});

// With options
var component = document.querySelector('.component');
var iframe = iframify(component, {
  headExtra: '<style>.component { color: red; }</style>',
  metaViewport: '<meta name="viewport" content="width=device-width">'
});

1
ทำไมคุณต้องการทำเช่นนั้น!
Dylan Watson


0

นี่เป็นเพียงแนวคิด แต่อย่าใช้สิ่งนี้โดยไม่ตรวจสอบความปลอดภัยและกรอง! มิฉะนั้นสคริปต์อาจแฮ็คไซต์ของคุณ!

คำตอบ: หากคุณควบคุมไซต์เป้าหมายคุณสามารถตั้งค่าสคริปต์ตัวรับเช่น:

1) ตั้งค่าลิงก์ iframe พร้อมstyleพารามิเตอร์เช่น:

http://your_site.com/target.php?color=red

(วลีสุดท้ายถูกa{color:red} เข้ารหัสโดยurlencodeฟังก์ชัน

2) ตั้งค่าหน้าผู้รับtarget.phpเช่นนี้:

<head>
..........
$col = FILTER_VAR(SANITIZE_STRING, $_GET['color']);
<style>.xyz{color: <?php echo (in_array( $col, ['red','yellow','green'])?  $col : "black") ;?> } </style>
..........

3
คำเตือน: นี่เป็นการฉีดที่ดีที่สุด
คาโน

1
อืมอย่าทำอย่างนี้เว้นแต่คุณต้องการโหลดบอททดสอบปากกาและสคริปต์ kiddies บนเซิร์ฟเวอร์ของคุณ =) ...
exside

1
ฉันได้อัปเดตคำตอบแล้วในตอนนี้พร้อมคำเตือนความปลอดภัยที่เพิ่มขึ้น
T.Todua

-18

ฉันได้ทำตามขั้นตอนเหล่านี้แล้ว:

  1. Div กับชั้นเรียนที่จะถือ iframe
  2. เพิ่มไปยังiframediv
  3. ในไฟล์ CSS
divClass { width: 500px; height: 500px; }
divClass iframe { width: 100%; height: 100%; }

ใช้งานได้ใน IE 6 ควรทำงานในเบราว์เซอร์อื่นตรวจสอบ!


9
จำเป็นต้องควบคุม div ภายใน iframe สิ่งนี้ไม่ได้
MSD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.