仅使用CSS,是否可能更改页面上iframe内部的div样式?
你需要 JavaScript。这与在父页面中执行相同,唯一的区别是必须在 JavaScript 命令前加上 iframe 的名称。
请记住,同源策略适用,因此您只能对来自自己服务器的 iframe 元素执行此操作。
我使用 Prototype 框架使它更容易:
frame1.$('mydiv').style.border = '1px solid #000000'
或者
frame1.$('mydiv').addClassName('withborder')
简而言之,不行。
如果由于跨域资源限制,除非您可以控制加载在iframe中的页面,否则无法将CSS应用于其中的HTML。
可以。查看此其他线程以获取详细信息: 如何将CSS应用于iframe?
const cssLink = document.createElement("link");
cssLink.href = "style.css";
cssLink.rel = "stylesheet";
cssLink.type = "text/css";
frames['frame1'].contentWindow.document.body.appendChild(cssLink);
// ^frame1 is the #id of the iframe: <iframe id="frame1">
frame1
是 iframe 的名称,而不是 ID。 - joseantgviframe
的内容,然后像往常一样使用 jQuery
选择器来操作它们。$("#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)); });
祝你好运!
简明回答是:不行,抱歉。
仅使用CSS是不可能的。基本上,您需要对iframe内容进行控制才能对其进行样式设置。有一些使用JavaScript或您选择的网络语言(我已经了解一些,但自己并不熟悉)来动态插入所需样式的方法,但您需要直接控制iframe内容,听起来好像您没有这个权限。
使用Jquery并等待源代码加载完成,这是我实现的方法(使用了Angular间隔,您也可以使用JavaScript的setInterval方法):
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);
结合不同的解决方案,以下是对我起作用的方法。
$(document).ready(function () {
$('iframe').on('load', function() {
$("iframe").contents().find("#back-link").css("display", "none");
});
});
显然,可以通过jQuery实现:
$('iframe').load( function() {
$('iframe').contents().find("head")
.append($("<style type='text/css'> .my-class{display:none;} </style>"));
});
Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
(未捕获的DOM异常:无法从“HTMLIFrameElement”读取“contentDocument”属性:阻止来自****的跨源框架访问。) - Mohammed AlBanna如果 iframe 来自另一个服务器,您将会遇到跨域错误,例如:
Uncaught DOMException: Blocked a frame with origin "https://your-site.com" from accessing a cross-origin frame.
const iframe = document.querySelector('#frame-id');
iframe.contentWindow.postMessage(/*any variable or object here*/, 'https://iframe-site.example.com');
在iframe站点上:
// Called sometime after postMessage is called
window.addEventListener("message", (event) => {
// Do we trust the sender of this message?
if (event.origin !== "http://your-main-site.com")
return;
...
...
});
<iframe src="/source" link=css-stylesheet:"/css.css">
这样的吗? - Ant<link>
标签。如果框架的源位于相同的父域上,则可以使用 JavaScript 注入样式标签(或内联样式)。 - kano