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);
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);
var head = jQuery("#iframe").contents().find("head");
var css = '<style type="text/css">' +
'#banner{display:none}; ' +
'</style>';
jQuery(head).append(css);
这会在iframe页面中隐藏 Banner . 谢谢你的建议!
35
这里,域内有两件事
iFrame部分
页面在iFrame中加载
所以你想要按如下方式设计这两个部分,
1. Style for the iFrame Section
它可以使用具有受尊重的 id 或 class 名称的CSS来设置样式 . 您也可以在父样式表中设置样式 .
//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);
26 回答
我认为最简单的方法是在iframe的同一个地方添加另一个div
使其
z-index
大于iframe容器,因此您可以轻松地设置自己的div样式 . 如果你需要点击它,只需在你自己的div上使用pointer-events:none
,所以如果你需要点击它就会运行iframe;)我希望它会帮助某人;)
扩展上述jQuery解决方案,以应对加载帧内容的任何延迟 .
我找到了另一个解决方案,将样式放在主html中,就像这样
然后在iframe中执行此操作(请参阅js onload)
并在js
它可能不是最好的解决方案,它肯定可以改进,但如果你想在父窗口中保留一个“样式”标签,这是另一种选择
如果您控制iframe中的页面,就像hangy所说,最简单的方法是创建一个具有常见样式的共享CSS文件,然后从您的html页面链接到它 .
否则,您不太可能从iframe中的外部页面动态更改页面样式 . 这是因为浏览器已经加强了跨框架dom脚本的安全性,因为可能会滥用欺骗和其他黑客攻击 .
This tutorial可能会为您提供有关脚本编写iframe的更多信息 . About cross frame scripting从IE角度解释了安全限制 .
如果iframe的内容不完全在您的控制之下,或者您想要使用不同样式访问不同页面中的内容,则可以尝试使用JavaScript进行操作 .
请注意,根据您使用的浏览器,这可能仅适用于来自同一域的网页 .
最好的方法可能是以下(如果您控制目标站点):
1)使用
style
参数设置iframe链接,如:(最后一个短语是由
urlencode
函数编码的a{color:red}
.2)设置接收器页面
target.php
如下:我的 compact version :
但是,有时
iframe
在窗口加载时尚未就绪,因此需要使用 timer .Ready-to-use code (带计时器):
...和jQuery链接:
有一个wonderful script用一个iframe版本替换一个节点 . CodePen Demo
Usage Examples:
以下对我有用 .
如果你想从主页面重用CSS和JavaScript,你应该考虑用加载Ajax的内容替换
<IFRAME>
. 现在,当搜索机器人能够执行JavaScript时,这更加SEO友好 .这是jQuery示例,其中包含文档中的另一个html页面 . 这比
iframe
更加SEO友好 . 为了确保机器人没有索引包含的页面,只需将其添加到robots.txt
中禁止您还可以直接从Google中添加jQuery:http://code.google.com/apis/ajaxlibs/documentation/ - 这意味着可选的自动包含更新的版本和一些显着的速度提升 . 此外,意味着你必须信任它们只为你提供jQuery;)
如果您有权访问iframe页面并且只有在您通过页面上的iframe加载时才想要使用其他CSS,这里我找到了解决这些问题的方法
即使iframe正在加载不同的域,这也适用
查看
postMessage()
计划是,将css作为消息发送给iframe
*
是发送此消息而不管iframe中的域名是什么并在iframe中接收消息并将收到的消息(CSS)添加到该文档头 .
要在iframe页面中添加的代码
您将无法以这种方式设置iframe的内容样式 . 我的建议是使用服务器端脚本(PHP,ASP或Perl脚本)或找到将feed转换为JavaScript代码的在线服务 . 唯一的另一种方法是,如果你可以做一个服务器端包含 .
我用 Google Calendar 遇到了这个问题 . 我想在较暗的背景上设计它并更改字体 .
幸运的是,嵌入代码中的URL对直接访问没有限制,因此通过使用PHP函数
file_get_contents
,可以从页面获取整个内容 . 可以调用位于服务器上的php文件,而不是调用Google URL .google.php
,其中包含原始内容并进行了修改:添加样式表的路径:
(这会将样式表放在
head
结束标记之前 . )如果相对调用css和js,请指定原始URL的基本URL:
最终的
google.php
文件应该如下所示:然后将
iframe
嵌入代码更改为:祝好运!
好吧,我遵循了以下步骤:
Div持有一个类
iframe
将
iframe
添加到div
.在CSS文件中,
这适用于IE 6.应该在其他浏览器中工作,请检查!
当你说“doc.open()”时,这意味着你可以在iframe中编写任何HTML标签,所以你应该为HTML页面编写所有基本标签,如果你想在iframe头中有一个CSS链接,那就写一个iframe中有CSS链接 . 我举个例子:
作为替代方案,您可以使用CSS-in-JS技术,如下面的lib:
https://github.com/cssobj/cssobj
它可以将JS对象作为CSS注入iframe,动态
以上稍作改动的工作原理:
适用于ff3和ie8至少
Edit: 除非设置了适当的CORS header,否则这不适用于跨域 .
这里有两个不同的东西:iframe块的样式和嵌入在iframe中的页面样式 . 您可以通常的方式设置iframe块的样式:
嵌入在iframe中的页面样式必须通过将其包含在子页面中来设置:
或者可以使用Javascript从父页面加载:
我们可以在iframe中插入样式标签 . Posted also here...
以下是如何直接应用CSS代码而不使用
<link>
来加载额外的样式表 .这会在iframe页面中隐藏 Banner . 谢谢你的建议!
这里,域内有两件事
iFrame部分
页面在iFrame中加载
所以你想要按如下方式设计这两个部分,
1. Style for the iFrame Section
它可以使用具有受尊重的
id
或class
名称的CSS来设置样式 . 您也可以在父样式表中设置样式 .2. Style the Page Loaded inside the iFrame
可以在Javascript的帮助下从父页面加载此样式
然后将该CSS文件设置为受尊重的iFrame部分
在这里,您也可以使用这种方式在iFrame内编辑页面的头部
使用可以试试这个:
这里的其他答案似乎使用jQuery和CSS链接 .
此代码使用vanilla JavaScript . 它创建了一个新的
<style>
元素 . 它将该元素的文本内容设置为包含新CSS的字符串 . 它将该元素直接附加到iframe文档的头部 .大多数浏览器都像一个不同的HTML页面一样处理iframe . 如果要将相同的样式表应用于iframe的内容,只需从其中使用的页面引用它 .