แทนที่ลักษณะเนื้อความสำหรับเนื้อหาใน iframe


165

ฉันจะควบคุมภาพพื้นหลังและสีขององค์ประกอบร่างกายภายในได้iframeอย่างไร หมายเหตุองค์ประกอบของร่างกายที่ฝังตัวมีคลาสและiframeเป็นของหน้าเว็บที่เป็นส่วนหนึ่งของเว็บไซต์ของฉัน

เหตุผลที่ฉันต้องการนี่คือเว็บไซต์ของฉันมีพื้นหลังสีดำกำหนดให้กับร่างกายและจากนั้นพื้นหลังสีขาวกำหนดให้กับ div ที่มีข้อความ เครื่องมือแก้ไข WYSIWYG ใช้iframeเนื้อหาเพื่อฝังเมื่อแก้ไข แต่ไม่รวม div ดังนั้นข้อความจึงอ่านยากมาก

เนื้อหาของตัวiframeแก้ไขเมื่อมีคลาสที่ไม่ได้ใช้ที่อื่นดังนั้นฉันสมมติว่านี่ถูกใส่ไว้ที่นั่นเพื่อแก้ไขปัญหาเช่นนี้ อย่างไรก็ตามเมื่อฉันใช้สไตล์กับclass.bodyพวกเขาจะไม่แทนที่สไตล์ที่ใช้กับเนื้อความ สิ่งที่แปลกก็คือสไตล์นั้นปรากฏใน Firebug ดังนั้นฉันไม่รู้เลยว่าเกิดอะไรขึ้น!

ขอบคุณ

อัปเดต - ฉันได้ลองวิธีการแก้ปัญหาของ @ mikeq ในการเพิ่มสไตล์ให้กับคลาสที่เป็นคลาสของร่างกาย สิ่งนี้ไม่ทำงานเมื่อถูกเพิ่มลงในสไตล์ชีทของหน้าหลัก แต่มันจะทำงานเมื่อเพิ่มด้วย Firebug ฉันสมมติว่านี่เป็นเพราะ Firebug ถูกนำไปใช้กับองค์ประกอบทั้งหมดในหน้าในขณะที่ CSS ไม่ได้ใช้ภายใน iframes นี่หมายความว่าการเพิ่ม css หลังจากโหลดหน้าต่างด้วย JavaScript จะทำงานได้หรือไม่


1
ซ้ำกันเป็นไปได้ของวิธีการใช้ CSS กับ iframe?
2540625

แม้ว่าจะไม่สามารถสัมผัสสิ่งใดก็ได้ใน iframe แต่การโหลด URL ต่อ Ajax ลงใน<div>กระป๋องบางครั้งอาจเป็นวิธีแก้ปัญหา (หากได้รับ CORS-Header อนุญาตให้ทำได้) ... (และ„ sanitizing“ ข้อมูลที่โหลดโดย regexp บน ทางใช่ทุก
แฮ็ค

คุณสามารถใช้จาวาสคริปต์หากโดเมนของหน้าตรงกัน แต่ทำไมไม่ใส่บล็อกสไตล์ไว้ใน HTML ของหน้าภายในเพื่อแทนที่สีที่คุณต้องการเปลี่ยน? เพียงเพิ่มตัวเลือกเพิ่มเติมในการแทนที่ของคุณหรือใช้สิ่งสำคัญ! ถ้าทั้งหมดอื่นล้มเหลวที่จะแทนที่รูปแบบสีที่คุณต้องการเฉพาะในหนึ่งหน้ากระดาษ ...
OG ฌอน

คำตอบ:


112

iframe คือ 'hole' ในหน้าเว็บของคุณที่แสดงหน้าเว็บอื่นภายใน เนื้อหาของ iframe ไม่ได้อยู่ในรูปร่างหรือส่วนหนึ่งส่วนใดของหน้าหลักของคุณ

ตามที่คนอื่นได้กล่าวไว้ตัวเลือกของคุณคือ:

  • ให้ไฟล์ที่กำลังโหลดใน iframe CSS ที่จำเป็น
  • หากไฟล์ใน iframe มาจากโดเมนเดียวกับพาเรนต์ของคุณคุณสามารถเข้าถึง DOM ของเอกสารใน iframe จากพาเรนต์ได้

251

ด้านล่างใช้งานได้หากเนื้อหา iframe มาจากโดเมนหลักเดียวกัน

สคริปต์ jquery ต่อไปนี้ใช้ได้สำหรับฉัน ทดสอบบน Chrome และ IE8 iframe ด้านในอ้างอิงถึงเพจที่อยู่ในโดเมนเดียวกับเพจระดับบน

ในกรณีนี้ฉันซ่อนองค์ประกอบที่มีคลาสเฉพาะใน iframe ด้านใน

โดยทั่วไปคุณเพียงแค่เพิ่มองค์ประกอบ 'สไตล์' ต่อท้าย 'หัว' ของ iframe ด้านใน

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

4
@ SimpleSam5 คุณสามารถให้ทางเลือก Javascript (โดยไม่ต้องใช้ Jquery)?
Kamalakannan J

1
@sincerekamal นี่คือรหัสโดยไม่จำเป็นต้อง jQuery: jsfiddle.net/9g9wkpon คุณเพียงแค่ต้องรู้ว่าคุณสมบัติ CSS ที่ใส่ยัติภังค์เขียนด้วย camelCase ใน JavaScript เช่นในตัวอย่างของฉัน :)
Dennis98

2
jquery.js? ver = 1.12.4: 2 Uncaught DOMException: ล้มเหลวในการอ่านคุณสมบัติ 'contentDocument' จาก 'HTMLIFrameElement': ปิดกั้นเฟรมที่มีต้นกำเนิด " xxxxxxxxx.com " ไม่ให้เข้าถึงเฟรม cross-origin
Alex Stanese

2
@AlexStanese เป็น jeremy state ซึ่งจะทำงานได้ก็ต่อเมื่อหน้า iframe มาจากเซิร์ฟเวอร์เดียวกับหน้าหลัก ... ซึ่งโดยทั่วไปหมายความว่าคุณไม่จำเป็นต้องกังวลกับ javascript anyways ... เพียงเพิ่ม CSS ไปยังหน้าอื่น ๆ ในที่แรก.
ดา

@ KamalakannanJ คุณไม่จำเป็นต้องใช้ Javascript เพียงแก้ไขหน้าที่อยู่ใน iFrame และใส่ CSS ลงไป
ดา

25

คุณไม่สามารถเปลี่ยนรูปแบบของหน้าเว็บที่แสดงใน iframe ได้เว้นแต่คุณจะมีการเข้าถึงโดยตรงดังนั้นจึงเป็นเจ้าของไฟล์ html และ / หรือ css ต้นทาง

นี่คือหยุดXSS (การเขียนสคริปต์ข้ามไซต์)


คุณหมายถึงอะไร 'การเข้าถึงโดยตรง' หน้าใน iframe มาจากไซต์ของฉันซึ่งเป็นโดเมนเดียวทั้งหมด
jd6699

2
ถ้าอย่างนั้นคุณจะต้องเปลี่ยนไฟล์ต้นฉบับบนเว็บไซต์ของคุณ (คุณไม่สามารถแก้ไขเนื้อหาใด ๆ ใน iframe) - ดังนั้นหาก iframe ชี้ไปที่ mysite.com/test.html คุณจะต้องแก้ไข test.html โดยตรง .. .
Myles Grey

1
ไม่ได้? ภายใต้เงื่อนไขที่ OP บอกว่าคุณทำได้ ตัวอย่างเช่น URL iframe ภายในของเขาเหมือนกับไซต์แม่ของเขาดังนั้นเขาควรจะสามารถเข้าถึง DOM ได้พร้อมกับรสชาติของจาวาสคริปต์ที่คุณชอบ ...
OG Sean

@ Myles Grey ผิด คุณสามารถแก้ไขเนื้อหาใน iframe ได้จากหน้าหลักของมันหากอยู่ในโดเมนเดียวกันทั้งที่มี JavaScript และ CSS
Kevin M

8

An iframeมีขอบเขตอื่นดังนั้นคุณจึงไม่สามารถเข้าถึงสไตล์หรือเปลี่ยนเนื้อหาด้วย javascript ได้

เป็นพื้น "หน้าอื่น"

สิ่งเดียวที่คุณทำได้คือแก้ไข CSS ของตัวเองเพราะด้วย CSS ทั่วโลกของคุณคุณไม่สามารถทำอะไรได้เลย


ใช่คุณสามารถทำได้ด้วย javascript โปรดทราบว่าทำงานได้ดีกับ URL iframe และ URL หลักที่ใช้โดเมนเดียวกัน แต่ฉันคิดว่าคุณถูกต้องแล้วสิ่งนี้สามารถทำได้ด้วย CSS บนหน้าเว็บใน iframe
OG ฌอน

8

แทนที่CSS โดเมนอื่น iframe

ด้วยการใช้ส่วนหนึ่งของคำตอบของ SimpleSam5ฉันได้รับสิ่งนี้ด้วย iframes การแชทของ Tawk ( ส่วนต่อประสานการปรับแต่งของพวกเขานั้นใช้ได้ แต่ฉันต้องการการปรับแต่งเพิ่มเติม)

ใน iframe นี้ที่ปรากฏบนอุปกรณ์พกพาฉันต้องซ่อนไอคอนเริ่มต้นและวางภาพพื้นหลังของฉัน ฉันทำต่อไปนี้:

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

ฉันไม่ได้เป็นเจ้าของโดเมน Tawk ใด ๆ และสิ่งนี้ใช้ได้ผลสำหรับฉันดังนั้นคุณอาจทำสิ่งนี้แม้ว่าจะไม่ได้มาจากโดเมนหลักเดียวกัน (แม้จะมีความคิดเห็นของ Jeremy Beckerเกี่ยวกับคำตอบของ Sam)


18
ฉันสงสัยว่าจะใช้งานได้เพียงเพราะคนที่ Tawk อนุญาตอย่างชัดเจน
Lawyerson

@CPHPython บางทีคุณสามารถช่วยฉันได้ ดูที่นี่: stackoverflow.com/questions/60923168/…
Success Man

7

รหัสนี้ใช้ JavaScript วานิลลา มันสร้าง<style>องค์ประกอบใหม่ มันตั้งค่าเนื้อหาข้อความขององค์ประกอบนั้นเป็นสตริงที่มี CSS ใหม่ และผนวกองค์ประกอบนั้นเข้ากับส่วนหัวของเอกสาร 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);

7
Blocked a frame with origin xxxxxxxxx from accessing a cross-origin frame.ฉันกลัวว่ามันจะไม่ทำงาน
Mike

1

หากคุณมีการควบคุมหน้าเว็บที่โฮสต์ iframe และหน้าของ iframe คุณสามารถส่งพารามิเตอร์การสืบค้นไปยัง iframe ...

นี่คือตัวอย่างในการเพิ่มคลาสให้กับ iframe โดยขึ้นอยู่กับว่าเว็บไซต์โฮสติ้งเป็นอุปกรณ์เคลื่อนที่หรือไม่

การเพิ่ม 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 ); 

ข้างใน 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");
}

บางทีคุณสามารถช่วยฉัน ดูที่นี่: stackoverflow.com/questions/60923168/…
Success Man

0

ฉันมีบล็อกและมีปัญหาในการค้นหาวิธีปรับขนาดส่วนที่ฝังตัวของฉัน ผู้จัดการโพสต์อนุญาตให้คุณเขียนข้อความวางรูปภาพและฝังโค้ด HTML เท่านั้น เค้าโครงบล็อกตอบสนองเอง มันสร้างด้วย Wix อย่างไรก็ตาม HTML ในตัวไม่ใช่ ฉันอ่านมากเกี่ยวกับวิธีการปรับขนาดส่วนประกอบภายในร่างกายของ iFrames ที่สร้างขึ้น ดังนั้นนี่คือคำแนะนำของฉัน:

หากคุณมีองค์ประกอบเดียวภายใน iFrame ของคุณเช่นส่วนสำคัญของคุณคุณสามารถปรับขนาดเฉพาะส่วนสำคัญได้ ลืมเกี่ยวกับ iFrame

ฉันมีปัญหากับวิวพอร์ต, เลย์เอาต์เฉพาะกับตัวแทนผู้ใช้ที่แตกต่างกันและนี่คือสิ่งที่แก้ไขปัญหาของฉัน:

<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>

ตรรกะคือการตั้งค่าส่วนสำคัญ (หรือส่วนประกอบของคุณ) CSS ตามตัวแทนผู้ใช้ ตรวจสอบให้แน่ใจว่าได้ระบุองค์ประกอบของคุณก่อนที่จะนำไปใช้กับตัวเลือกแบบสอบถาม อย่าลังเลที่จะดูว่าการตอบสนองนั้นทำงานอย่างไร


-3

บางทีมันอาจจะเปลี่ยนไป แต่ฉันได้ใช้สไตล์ชีทแยกกับองค์ประกอบนี้:

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

หากต้องการสไตล์ให้ฝัง youtube iframes สำเร็จ ... ดูโพสต์บล็อกในหน้านี้


4
ในขณะที่ลิงค์นี้อาจตอบคำถามได้ดีกว่าที่จะรวมส่วนที่สำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง คำตอบสำหรับลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
Shaiful ศาสนาอิสลาม

4
สิ่งนี้ใช้กับองค์ประกอบ iFrame เท่านั้น - คำถามจะถามเฉพาะเกี่ยวกับเนื้อหาของ iFrame ซึ่งปัจจุบันไม่สามารถเปลี่ยนผ่าน CSS เพียงอย่างเดียว
pwdst

@ShaifulIslam ซึ่งเป็นสิ่งที่เกิดขึ้นอย่างแม่นยำ Tims การตอบกลับไร้ประโยชน์
Alex Foxleigh

-24

ให้ ID ของหน้า iframe แก่คุณ (หรือคลาสหากคุณต้องการ)

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

จากนั้นภายในหน้าของ iframe ให้กำหนดพื้นหลังให้กับใน CSS

#myId {
    background-color: white;
}

นี่มันแปลก โซลูชันของคุณใช้ได้กับฉันเมื่อฉันเพิ่มลงในเพจด้วย firebug แต่ไม่ทำงานหากอยู่ในไฟล์ css ปกติของหน้า นี่อาจเป็นส่วนหนึ่งของความคิดเห็นของคุณ 'สมมติว่าหน้าภายใน iFrame เป็นของคุณที่จะแก้ไข'? ฉันไม่เข้าใจว่าคุณหมายถึงอะไร ขอบคุณ
jd6699

ฉันหมายความว่าเพจที่คุณโหลดเข้าสู่ iFrame จากไซต์ของคุณและอยู่ภายใต้การควบคุมของคุณหรือไม่ หรือมาจากไซต์ภายนอกที่คุณไม่สามารถแก้ไขต้นฉบับเพื่อรวมรหัส / คลาสนั้นได้
mikeq

มันมาจากเว็บไซต์ของฉัน แต่เมื่อทำโดยผู้แก้ไขมันจะไม่ง่ายในการเปลี่ยนเครื่องหมายที่ดึงขึ้นมา
jd6699

ป.ล. ฉันไม่ได้ตั้งใจเพิ่ม id = "myId" ในหน้าหลักของคุณ แต่ไปยังหน้าภายใน iFrame ด้วยวิธีนี้คุณสามารถกำหนดเป้าหมายเนื้อความของหน้า iFrame ด้วยสไตล์ที่แตกต่างไปยังหน้าหลักของคุณ คุณกำลังอ้างถึงไฟล์ CSS ในหน้า iFrame ของคุณเช่นกันไม่ใช่คุณ คุณต้องปฏิบัติต่อหน้าที่โหลดใน iFrame เป็นหน้าอิสระอย่างสมบูรณ์ หากคุณโหลดหน้าเว็บนั้นลงในเว็บเบราว์เซอร์จะมีสไตล์ที่ถูกต้องหรือไม่
mikeq

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