Ghi đè kiểu cơ thể cho nội dung trong iframe


165

Làm cách nào tôi có thể kiểm soát hình ảnh nền và màu sắc của một yếu tố cơ thể trong một iframe? Lưu ý, phần tử cơ thể nhúng có một lớp và iframelà một trang là một phần của trang web của tôi.

Lý do tôi cần điều này là trang web của tôi có nền đen được gán cho cơ thể và sau đó nền trắng được gán cho div có chứa văn bản. Trình iframechỉnh sửa WYSIWYG sử dụng nội dung để nhúng khi chỉnh sửa, nhưng nó không bao gồm div, vì vậy văn bản rất khó đọc.

Phần thân của iframetrình soạn thảo có một lớp không được sử dụng ở bất kỳ nơi nào khác, vì vậy tôi cho rằng điều này được đặt ở đó để những vấn đề như thế này có thể được giải quyết. Tuy nhiên, khi tôi áp dụng các kiểu cho class.bodychúng, chúng sẽ không ghi đè lên các kiểu được áp dụng cho cơ thể. Điều kỳ lạ là các phong cách xuất hiện trong Fireorms, vì vậy tôi không biết chuyện gì đang xảy ra!

Cảm ơn

CẬP NHẬT - Tôi đã thử giải pháp của @ mikeq về việc thêm một kiểu cho lớp đó là lớp của cơ thể. Điều này không hoạt động khi được thêm vào biểu định kiểu của trang chính, nhưng nó hoạt động khi được thêm với Fireorms. Tôi cho rằng điều này là do Firebird được áp dụng cho tất cả các thành phần trên trang trong khi CSS không được áp dụng trong iframe. Điều này có nghĩa là thêm css sau khi tải cửa sổ với JavaScript sẽ hoạt động?


1
Có thể trùng lặp Cách áp dụng CSS cho iframe?
2540625

Mặc dù không thể chạm vào bất cứ thứ gì trong iframe, nhưng việc tải URL đó theo Ajax vào một <div>lúc nào đó có thể là một cách giải quyết (nếu được cung cấp CORS-Header sẽ cho phép điều đó) ... (và „vệ sinh dữ liệu được tải bằng cách khai thác lại trên cách. Vâng, tất cả hacky ...)
Frank Nocke

Bạn có thể sử dụng javascript nếu tên miền trang khớp, nhưng tại sao không đặt khối kiểu trong HTML của trang bên trong để ghi đè màu bạn muốn thay đổi? Chỉ cần thêm nhiều bộ chọn trong ghi đè của bạn hoặc sử dụng quan trọng! nếu vẫn thất bại, ghi đè bất kỳ kiểu màu nào bạn muốn chỉ trên một trang đó ...
OG Sean

Câu trả lời:


111

Một iframe là một 'lỗ hổng' trong trang của bạn hiển thị một trang web khác bên trong nó. Nội dung của iframe không ở bất kỳ hình dạng hoặc hình thức nào của trang mẹ của bạn.

Như những người khác đã nêu, các tùy chọn của bạn là:

  • cung cấp cho tệp đang được tải trong iframe CSS cần thiết
  • nếu tệp trong iframe là từ cùng một miền với cha mẹ của bạn, thì bạn có thể truy cập DOM của tài liệu trong iframe từ cha mẹ.

251

Dưới đây chỉ hoạt động nếu nội dung iframe là từ cùng một miền cha.

Các kịch bản jquery sau đây làm việc cho tôi. Đã thử nghiệm trên Chrome và IE8. Khung nội tuyến tham chiếu một trang nằm trên cùng một miền với trang mẹ.

Trong trường hợp cụ thể này, tôi đang ẩn một phần tử với một lớp cụ thể trong iframe bên trong.

Về cơ bản, bạn chỉ cần thêm phần tử 'kiểu' vào 'phần đầu' của iframe bên trong.

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

4
@ SimpleSam5 Bạn có thể cung cấp giải pháp thay thế Javascript (không sử dụng Jquery) không?
Kamalakannan J

1
@sincerekamal Đây là mã không cần jQuery: jsfiddle.net/9g9wkpon Bạn chỉ cần biết rằng các thuộc tính CSS được gạch nối được viết bằng camelCase trong JavaScript, như trong ví dụ của tôi. :)
Dennis98

2
jquery.js? ver = 1.12.4: 2 Uncaught DOMException: Không thể đọc thuộc tính 'contentDocument' từ 'HTMLIFrameEuity': Bị chặn một khung có nguồn gốc " xxxxxxxxx.com " khi truy cập khung có nguồn gốc chéo.
Alex Stanese 9/12/2016

2
@AlexStan là trạng thái giật, điều này chỉ hoạt động nếu trang iframe đến từ cùng một máy chủ với trang mẹ ... điều đó có nghĩa là bạn không cần phải bận tâm với javascript dù sao ... chỉ cần thêm CSS vào trang khác ở vị trí đầu tiên
DA.

@KamalakannanJ bạn thậm chí không cần sử dụng Javascript. Chỉ cần chỉnh sửa trang trong iFrame và đặt CSS ở đó.
DA.

25

Bạn không thể thay đổi kiểu trang được hiển thị trong iframe trừ khi bạn có quyền truy cập trực tiếp và do đó quyền sở hữu các tệp html và / hoặc css nguồn.

Điều này là để dừng XSS (Cross Site Scripting)


"Truy cập trực tiếp" nghĩa là gì? Trang trong iframe là từ trang web của tôi, tất cả là một tên miền.
jd6699

2
Vậy thì bạn sẽ cần thay đổi tệp nguồn trên trang web của mình (bạn không thể sửa đổi bất kỳ nội dung nào trong iframe) - vì vậy nếu iframe đang trỏ vào mysite.com/test.html thì bạn sẽ cần phải sửa đổi trực tiếp test.html. .
Myles Grey

1
Không thể? Trong điều kiện OP nói bạn có thể. Ví dụ: URL iframe bên trong của anh ấy giống như trang mẹ của anh ấy, vì vậy anh ấy có thể truy cập DOM ok với bất kỳ hương vị javascript nào bạn thích ...
OG Sean

@ Kiểu xám sai. Bạn có thể sửa đổi nội dung trong iframe từ trang mẹ của nó nếu nó trên cùng một tên miền, cả với JavaScript và CSS.
Kevin M

8

An iframecó một phạm vi khác, vì vậy bạn không thể truy cập nó để tạo kiểu hoặc thay đổi nội dung của nó bằng javascript.

Về cơ bản là "một trang khác".

Điều duy nhất bạn có thể làm là chỉnh sửa CSS của chính nó, bởi vì với CSS toàn cầu của bạn, bạn không thể làm gì được.


Có, bạn có thể, với javascript. Lưu ý rằng nó hoạt động tốt nhất với URL iframe và URL gốc chia sẻ cùng một tên miền. Nhưng, tôi nghĩ rằng bạn đã đúng khi chỉ ra điều này chỉ có thể được thực hiện bằng CSS trên trang bên trong iframe.
OG Sean

8

Ghi đè CSS tên miền khác iframe

Bằng cách sử dụng một phần câu trả lời của SimpleSam5 , tôi đã đạt được điều này với một vài iframe trò chuyện của Tawk ( giao diện tùy chỉnh của chúng vẫn ổn nhưng tôi cần tùy chỉnh thêm).

Trong iframe cụ thể này hiển thị trên thiết bị di động, tôi cần ẩn biểu tượng mặc định và đặt một trong những hình nền của mình. Tôi đã làm như sau:

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

Tôi không sở hữu bất kỳ tên miền nào của Tawk và điều này hiệu quả với tôi, do đó bạn có thể làm điều này ngay cả khi nó không thuộc cùng miền cha mẹ (mặc dù nhận xét của Jeremy Beck về câu trả lời của Sam).


18
Tôi nghi ngờ điều này chỉ hoạt động vì những người ở Tawk đã cho phép nó rõ ràng.
Luật sư

@CPHPython Có lẽ bạn có thể giúp tôi. Nhìn vào đây: stackoverflow.com/questions/60923168/ từ
Người đàn ông thành công

7

Mã này sử dụng JavaScript vanilla. Nó tạo ra một <style>yếu tố mới . Nó đặt nội dung văn bản của phần tử đó là một chuỗi chứa CSS mới. Và nó nối phần tử đó trực tiếp vào phần đầu của tài liệu 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.Tôi sợ nó sẽ không hoạt động
Mike

1

Nếu bạn có quyền kiểm soát trang lưu trữ iframe và trang của iframe, bạn có thể chuyển tham số truy vấn cho iframe ...

Dưới đây là một ví dụ để thêm một lớp vào iframe dựa trên việc trang web lưu trữ có di động hay không ...

Thêm 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 ); 

Bên trong 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");
}

Có lẽ bạn có thể giúp tôi. Nhìn vào đây: stackoverflow.com/questions/60923168/ từ
Người đàn ông thành công

0

Tôi có một blog và tôi đã gặp rất nhiều khó khăn khi tìm cách thay đổi kích thước ý chính nhúng của mình. Trình quản lý bài đăng chỉ cho phép bạn viết văn bản, đặt hình ảnh và nhúng mã HTML. Bố cục blog là đáp ứng chính nó. Nó được xây dựng với Wix. Tuy nhiên, HTML nhúng thì không. Tôi đã đọc rất nhiều về việc không thể thay đổi kích thước các thành phần bên trong cơ thể của iFrames được tạo. Vì vậy, đây là gợi ý của tôi:

Nếu bạn chỉ có một thành phần bên trong iFrame của mình, tức là ý chính của bạn, bạn chỉ có thể thay đổi kích thước của ý chính. Hãy quên iFrame đi.

Tôi gặp vấn đề với chế độ xem, bố cục cụ thể cho các tác nhân người dùng khác nhau và đây là điều đã giải quyết vấn đề của tôi:

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

Logic là đặt css (hoặc thành phần của bạn) css dựa trên tác nhân người dùng. Hãy chắc chắn xác định thành phần của bạn trước, trước khi áp dụng cho bộ chọn truy vấn. Hãy xem phản ứng đang hoạt động như thế nào .


-3

Có lẽ bây giờ nó đã thay đổi, nhưng tôi đã sử dụng một bản định kiểu riêng với phần tử này:

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

để thành công phong cách nhúng iframe youtube ... xem các bài đăng blog trên trang này .


4
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
Hồi giáo Shaiful

4
Điều này chỉ áp dụng cho chính phần tử iFrame - câu hỏi hỏi cụ thể về nội dung iFrame, hiện tại không thể thay đổi thông qua CSS.
pwdst

@ShaifulIslam chính xác là những gì đã xảy ra. Tim Rending trả lời vô dụng.
Alex Foxleigh

-23

cung cấp cho phần thân trang iframe của bạn một ID (hoặc lớp nếu bạn muốn)

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

sau đó, cũng trong trang của iframe, gán nền cho CSS trong

#myId {
    background-color: white;
}

Điều này thật kỳ lạ. Giải pháp của bạn hoạt động với tôi khi tôi thêm nó vào trang bằng fireorms, nhưng không hoạt động nếu nó nằm trong tệp css bình thường của trang. Đây có thể là một phần trong nhận xét của bạn 'giả sử trang trong iFrame là của bạn để chỉnh sửa'? Tôi không hiểu ý của bạn là gì Cảm ơn
jd6699

Ý tôi là, đó có phải là trang bạn đang tải vào iFrame từ trang web của bạn và dưới sự kiểm soát của bạn không? hoặc là từ một trang web bên ngoài mà bạn không thể chỉnh sửa nguồn để bao gồm id / class đó.
mikeq

Đó là từ trang web của tôi, nhưng do trình soạn thảo thực hiện, nó sẽ không dễ dàng thay đổi đánh dấu được kéo qua.
jd6699

ps Tôi không có nghĩa là thêm id = "myId" vào trang chính của bạn, nhưng vào trang trong iFrame. Bằng cách đó, bạn có thể nhắm mục tiêu phần thân của trang iFrame với kiểu khác với trang chính của bạn. Bạn cũng đang tham khảo tệp CSS trong các trang iFrame của mình cũng không phải là bạn. Bạn cần coi trang được tải trong iFrame là một trang hoàn toàn độc lập. Nếu bạn chỉ tải trang đó vào trình duyệt web thì nó có đúng kiểu không?
mikeq

Tôi không thực sự chắc chắn nơi 'trang' không phải là toàn bộ trang mà biên tập viên sử dụng. Cảm ơn sự giúp đỡ của bạn, tôi nghĩ rằng tôi hiểu làm thế nào tất cả những thứ này hoạt động noe.
jd6699
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.