防止注入页面更改父页面中的样式

Posted

技术标签:

【中文标题】防止注入页面更改父页面中的样式【英文标题】:Prevent injected page from changing style in parent page 【发布时间】:2014-01-12 21:47:51 【问题描述】:

我有一个非常简单的测试页面布局:

<div id="nav">Some content here</div>

<div id='siteloader'></div>

通过一些 AJAX,我加载了 http://www.example.com/ 的内容(字面意思是这个页面) 在 #siteloader 中。 我在我的服务器上使用 php 脚本加载此页面,因此同源策略没有问题

http://www.example.com/ 的样式如下所示

div 
    width: 600px;
    margin: 5em auto;
    padding: 50px;
    background-color: #fff;
    border-radius: 1em;
 

现在,当我在#siteloader 中加载http://www.example.com/ 的内容时,上述样式也适用于#nav

如何防止注入的页面覆盖我的文档样式?加载文档的样式只需要应用到#siteloader的内容上

【问题讨论】:

将其加载到 &lt;ifame&gt; 中? 或者因为你是通过 AJAX 加载,所以修改类/样式? 不能使用&lt;iframe&gt;,因为我需要通过 jQuery 访问页面的代码。动态修改非常困难,因为加载的页面并不总是相同的。可以通过网络上的每个页面。 www.example.com 样式是嵌入还是内联? @AndrewB 不知道有什么区别。你可以检查一下,因为我的意思是example.com 【参考方案1】:

从 example.com 获取所有数据后,您可以在 siteloader 中尝试类似的操作:

$("#siteloader style").remove();

也只是为了您自己的利益,还有一个名为 nav 的 html5 标签,它与 div id="nav" 相同,但它对网络爬虫在索引您的页面时有好处。

编辑:我将其编辑为“#siteloader 样式”,这意味着仅删除了站点加载器中的样式标记。

~安德鲁

【讨论】:

$("#siteloader style").remove(); 表示从#siteloader 中删除所有样式?这不是我想要的,我需要从远程加载的样式保持不变,但我不希望它干扰我页面上已有的内容 对不起,我误会了。我不相信这是可能的,因为您必须即时确定什么是有用的,什么是无用的。此外,如果从 example.com 获取的样式类似于“div...”,它自然会影响您页面的其余部分并且您无法更改。 除非你使用一些脚本在每条 css 指令前插入“#siteloader”(注意空格),这意味着只有 siteloader 中的内容可以更改为从example.com【参考方案2】:

除非/直到浏览器广泛支持scoped styles,否则没有简单的解决方案可以解决您的问题。如果您愿意依赖 javascript 库,可以使用 couple 或 plugins 来模拟作用域样式。

【讨论】:

This pluging 似乎做了我想做的事,但我无法绕开它。我猜注入页面中的所有样式都必须限定范围?正如我之前所说,注入的页面可以是互联网上的任何页面,因此它们可以具有内联 css(我猜不用担心)、外部样式表和嵌入式样式。如何处理? 通过 PHP 脚本中的 preg_replace 将scoped=true 属性添加到下载页面的&lt;style&gt; 元素中。并将&lt;script src="js/jquery.scoped.js"&gt;&lt;/script&gt; 添加到我的 HTML 文件中。没有帮助。 哦,忘了在正文中添加onload="$.scoped(); 。添加了它,但没有任何变化。现在还添加了一个带有onclick="$.scoped(); 的按钮。现在,当我加载页面时,#siteloader 的样式会像以前一样混淆页面其余部分的样式。但是当我单击此按钮时,#siteloader 再次为空,页面的其余部分不再混乱。奇怪.....

以上是关于防止注入页面更改父页面中的样式的主要内容,如果未能解决你的问题,请参考以下文章

当鼠标悬停在 Firefox 中的嵌入式 iframe 上时,防止父页面滚动

防止 Summernote html 所见即所得编辑器页面被内容 CSS 更改

Magnolia 防止使用父页面模板创建子页面

iframe 子页面改变父页面样式

页面框架内的WPF按钮导航以更改父页面

iframe 子页面获取父页面的元素并且控制样式