Firefox返回时Iframe的显示Bug

Bug演示

一个页面有4个Iframe来显示flash内容,其中第二个iframe的显示是用Javascript控制的,只有当特定的cookie存在时才出现,否则显示普通的文本。其控制代码是:

<script type="text/javascript">//<![CDATA[
if(getCookie('firefoxIframe')){
document.write('<p id="addAd"><a href="cookie.html">点击这里删除这个iframe</a></p>');
document.write('<iframe height="120" width="300" marginheight="0" marginwidth="0"
frameborder="0" src="nAdPre.swf"></iframe>');
}else{
document.write('<p id="addAd"><a href="cookie.html">点击这里增加一个iframe</a></p>');
}
//]]></script>
  1. 打开Bug演示,由于cookie不存在,显示的三个flash都是通过Iframe实现的
  2. 点击“点击这里增加一个iframe广告”,跳转到一个新的页面写入名为firefoxIframe的Cookie
  3. 点击“返回”或者浏览器的返回按钮,回到Bug演示页面,发现iframe里面的flash错位,即位置2的iframe链接的flash并没有载入,显示的是位置3的flash,位置3的显示的是位置4的flash,位置4的flash却依旧存在
  4. 关闭标签页(不是关闭整个浏览器,如果关闭整个浏览器Cookie也失效)或新打开一个标签页重新载入该页面,4个Iframe正常显示4个flash
  5. 此时如果点击“点击这里删除这个iframe广告”,跳转到新页面删除Cookie,返回也发现Iframe中的flash错位
  6. 如果写入Cookie或者删除Cookie时,不通过浏览器的返回,直接通过网址访问,则不会出现错位

简单分析和解决方案

似乎Firefox返回时,Javascript重新执行了,但是Iframe并未依据src属性重新载入,而是给Iframe和src以类似编号似的配对,而由于返回时Javascript的执行,导致Iframe多了一个(或少了一个),这就导致后面的配对错位。

以上仅为猜测,但这的确是Firefox(2.0.0.3)的一个bug,IE返回时Javascript重新执行,并且Iframe的依据src重新载入,Opera返回时Javascript不重新执行,页面没有变化。

解决方案是在文本中增加一个隐藏的Iframe来占位,上面代码修改如下代码如下:

document.write('<p id="addAd"><a href="cookie.html">点击这里增加一个iframe</a></p>');
//把上面的代码修改成为
document.write('<iframe src="#" style="display:none;"></iframe>');
document.write('<p id="addAd"><a href="cookie.html">点击这里增加一个iframe</a></p>');

请看修改后的演示

标签:, ,

作者:秦歌,时间:2007-05-13 0:25,归纳于:Javascript & DOM & AJAX,订阅:RSS 2.0,引用:Trackback

有评论 4 条,发表一条评论 »

Sutra.re.Zhou说:2007-05-14 9:44 #1

我点击了那个“点击这里增加一个广告”,然后返回,并没有看到有什么变化,和点击之前是一样的呀。

秦歌说:2007-05-14 11:01 #2

不好意思,我忘记去掉写入COOKIE的那个页面的一个注释符号,导致错误,现在修正了。

匿名说:2007-11-09 16:01 #3

郁闷,在2.0.0.9发现类似问题,页面一刷新就出现iframe错位现象

Firefox2中输入框丢失光标bug @ 随网之舞说:2008-03-08 23:40 #4

[...] 现在看来Firefox2对iframe的处理bug还真不少,比如以前就发现了Firefox返回时Iframe的显示Bug。 [...]

发表一条评论

您可以在下面评论内容中使用下列XHTML标签:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

您或许有兴趣:

回到页眉