【问题标题】:Workaround for drawing bug when Overlaying a <div> over an <iframe> in Safari?在 Safari 中将 <div> 覆盖在 <iframe> 上时绘制错误的解决方法?
【发布时间】:2009-05-11 23:13:44
【问题描述】:

我在 Safari 中遇到了一个非常奇怪的绘图错误,我想看看是否有任何解决方法可以采取...

我目前正在显示来自其他网站的内容的 IFrame 顶部显示一个

(绝对定位,高 z-index)。就上下文而言,
是我们在其他网站上显示的工具栏。

这在所有浏览器中都适用,但在 Safari 中,当 IFrame 显示 一些 网站时,用户在 IFrame 中滚动页面时,工具栏的绘制就会变得一团糟。

这是一个重现问题的非常简约的 POC:

<html>
<head>
</head>
<body>

<div id="mainContainer" style="position: absolute; top: 0; left:0; height: 500px; width: 500px; border: 2px solid red;">
    <div id="floatingToolbar" style="position: absolute; top: 20px; right: 20px; height: 40px; width: 300px; background-color: blue; color: red; z-index:200;">
        Toolbar!
    </div>
    <iframe id="theIFrame" src="http://www.overstock.com/Clothing-Shoes/Skynyrd-Mens-Rock-Roll-Freebird-Lyric-T-shirt/3023049/product.html?sec_iid=33972" style="position: absolute; top: 0; left:0; height: 500px; width: 500px; border: 2px solid red;">
    </iframe>
</div>

</body>
</html>

如果你把它保存到你的硬盘上,然后用 Firefox 打开它,你会得到这个:


(来源:crystalgears.com


如果你在 Safari 中打开它,然后在 IFrame 中上下滚动,它会看起来像这样:


(来源:crystalgears.com


现在,这发生在 Safari 中。 Chrome 工作正常。 它发生在 Safari Windows 和 Mac 中。我正在使用 Safari Windows 3.2.1 (525.27.1) 进行测试,但我已经看到它发生在其他版本中。

为了让这更神秘,只有当我在 IFrame 中显示 一些 网站时才会发生这种情况。例如,如果您显示 www.google.com 或 www.stackoverflow.com,则工具栏可以正常工作。但是,www.overstock.com 或 www.amazon.com 内的项目运行良好。此外,给我这个问题的不仅仅是几个网站。 很多。我一直无法找到一些特别的东西来始终区分“坏”网站和“好”网站,但我还没有深入研究。也许它是 DOCTYPE,或者别的什么。似乎有一条规则(尽管它非常软)是“复杂”或“重”网站往往会触发它,而“轻”网站则不会。

关于我可以做些什么来解决这个问题的任何想法?

谢谢!

【问题讨论】:

标签: iframe safari rendering


【解决方案1】:

我预计在 iframe 顶部渲染时会出现意外情况,类似于将 div 放置在 Flash 视频上时。它可以工作,有时也可以。但在 Flash 或 iframe 中滚动或移动可能会引发一些渲染问题。

您是否有机会使用与 iframe 不同的解决方案?使用像 cURL 这样的库从不同的页面获取数据就足够了吗?

【讨论】:

  • 感谢您的回复!不,如果没有 IFrame,我们就无法逃脱,我们想让用户使用我们内部的其他网站。通过 cURL 代理它会破坏大多数现代网站,因为它们中的很多都依赖于 Javascript 来实现它们的许多功能。我同意在 IFrame 上绘图是“奇怪的”。当我第一次尝试时,我什至没想到 z-index 会起作用,但事实上,所有其他浏览器都表现得非常完美,甚至是糟糕的 IE6...
  • 嗯,我想这取决于有多少用户使用 Safari 与您希望人们使用此功能的程度。 cURL 仍然可以与 JS 一起工作。循环外部引用并使它们成为绝对路径。当然,这种方法也不是什么好方法。只是一个建议。
  • 是的,这是一场等待发生的安全灾难...... :-) 加上循环访问外部引用是一个理想的解决方案。许多网站通过做奇怪的 Response.Write's、添加
  • response.write 不是 ASP 的一部分吗? cURL 只能获取输出到浏览器的内容。
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多