我有一个简单的页面,有一些iframe部分(显示RSS链接).如何将主页面中的相同CSS格式应用于iframe中显示的页面?
编辑:除非设置了适当的CORS标头,否则这不适用于跨域.
这里有两个不同的东西:iframe块的样式和嵌入在iframe中的页面样式.您可以通常的方式设置iframe块的样式:
嵌入在iframe中的页面样式必须通过将其包含在子页面中来设置:
或者它可以使用Javascript从父页面加载:
var cssLink = document.createElement("link");
cssLink.href = "style.css";
cssLink.rel = "stylesheet";
cssLink.type = "text/css";
frames['iframe1'].document.head.appendChild(cssLink);
我在Google日历中遇到了这个问题.我想在较暗的背景上设计它并改变字体.
幸运的是,嵌入代码中的URL对直接访问没有限制,因此通过使用PHP函数file_get_contents
,可以从页面获取整个内容.可以调用位于服务器上的php文件,而不是调用Google URL.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('','', $content);
(这会将样式表放在head
结束标记之前.)
如果css和js相对调用,请指定原始URL的基本URL:
$content = str_replace('',' ', $content);
最终google.php
文件应如下所示:
',' ', $content);
$content = str_replace('','', $content);
echo $content;
然后将iframe
嵌入代码更改为:
祝好运!
如果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);
请注意,根据您使用的浏览器,这可能仅适用于来自同一域的网页.
var $head = $("#eFormIFrame").contents().find("head"); $head.append($("", { rel: "stylesheet", href: url, type: "text/css" }));
大多数浏览器都会像一个不同的HTML页面一样处理iframe.如果要将相同的样式表应用于iframe的内容,只需从其中使用的页面引用它即可.
以下是如何直接应用CSS代码而不使用加载额外的样式表.
var head = jQuery("#iframe").contents().find("head"); var css = ''; jQuery(head).append(css);
这会在iframe页面中隐藏横幅.谢谢你的建议!
如果您控制iframe中的页面,就像hangy所说的那样,最简单的方法是创建一个具有常见样式的共享CSS文件,然后从您的html页面链接到它.
否则,您不太可能从iframe中的外部页面动态更改页面样式.这是因为浏览器已经加强了跨框架dom脚本的安全性,因为可能会滥用欺骗和其他黑客攻击.
本教程可能会为您提供有关一般脚本编写iframe的更多信息. 关于跨框架脚本从IE角度解释了安全性限制.
以上稍有改动的工作原理:
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至少
如果你想从主页面重用CSS和JavaScript,你应该考虑用Ajax加载的内容替换.现在,当搜索机器人能够执行JavaScript时,这更加SEO友好.
这是jQuery示例,其中包含另一个html页面到您的文档中.这比SEO更友好iframe
.为了确保机器人没有索引包含的页面,只需将其添加到禁止进入robots.txt
您还可以直接在Google中添加jQuery:http://code.google.com/apis/ajaxlibs/documentation/ - 这意味着可选的自动包含更新的版本和一些显着的速度提升.此外,意味着您必须信任它们只为您提供jQuery;)
以下对我有用.
var iframe = top.frames[name].document; var css = '' + ''; iframe.open(); iframe.write(css); iframe.close();
扩展上述jQuery解决方案,以应对加载帧内容的任何延迟.
$('iframe').each(function(){
function injectCSS(){
$iframe.contents().find('head').append(
$('', { rel: 'stylesheet', href: 'iframe.css', type: 'text/css' })
);
}
var $iframe = $(this);
$iframe.on('load', injectCSS);
injectCSS();
});
我的紧凑版本:
但是,有时iframe
在窗口加载时没有准备好,因此需要使用计时器.
即用型代码(带定时器):
...和jQuery链接:
当你说"doc.open()"时,它意味着你可以在iframe中编写任何HTML标签,所以你应该为HTML页面编写所有基本标签,如果你想在你的iframe头中有一个CSS链接,那就写一个iframe中有CSS链接.我举个例子:
doc.open(); doc.write('Print Frame
这里的其他答案似乎使用jQuery和CSS链接。
此代码使用原始JavaScript。它创建一个新元素。它将该元素的文本内容设置为包含新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);
使用可以尝试一下:
$('iframe').load( function() { $('iframe').contents().find("head") .append($("")); });
您将无法以这种方式设置iframe的内容样式.我的建议是使用服务器端脚本(PHP,ASP或Perl脚本)或找到将feed转换为JavaScript代码的在线服务.唯一的另一种方法是,如果你可以做一个服务器端包含.