请先把问题看完,十分感谢。假设:
1.页面加载过程中会在一组iframe框架前N(N>0)行代码运行一个js function(假设为fun())。
2.该组iframe为连续的,比如:<div id="cont"></div>
<div class="left">
   <iframe src="1.swf" id="iframe_1"></iframe>
</div>
<div class="middle">
   <iframe src="2.swf" id="iframe_2"></iframe>
</div>
<div class="right">
  <iframe src="3.swf" id="iframe_3"></iframe>
</div>3.fun()中包含动态加载js(在head下append一个新的script结点,取其中的变量)。问题:当fun()中有appendChild Dom对象的innerHTML中包含图片时(见示例),初次加载没有任何问题,但是刷新(F5或者点浏览器刷新按钮)会有很大的概率(60%)导致上述iframe组加载出乱,即,可能会出现 iframe_2,iframe_1加载了1.swf,iframe_3加载了3.swf.dom加载示例    var doc = document.CreateElement("DIV");
    document.getElementById("cont").appendChild(doc);
    doc.innerHTML =="<img src=\"1.gif\">";
备注,此问题仅在ie下出现,在360安全浏览器出现概率很高,且仅在静态页(动态页本机调试没有出现此类问题,至于在服务器上没有进行全面测试)。我的临时解决方法,1:把要添加的img先放在层cont里面,然后每次修改它的src。2,将iframe组中的没有iframe直接用document.write在页面上写出来。 以前两种方法经测试均有效(实现一种即可)。问有人了解这方面的缘由吗?或者说说你的看法。(此iframe为第三方的广告代码,请考虑过是否是他的代码问题,但简单测试过似乎没有影响,所以偏向于是自己代码(fun())的问题)。

解决方案 »

  1.   

    偷懒的办法:
    <script>
    window.onbeforeunload=function(){
      //判断动态添加的控件,一一删除
    }
    </script>
      

  2.   

    你说iframe 加载的src是乱的?不是原先设置的src的内容?
      

  3.   


    你不是说:“初次加载没有任何问题,但是刷新(F5或者点浏览器刷新按钮)会有很大的概率(60%)导致上述iframe组加载出乱”吗?我意思是说,当客户刷新前把所有动态添加的控件全部删除,让页面恢复初始状态,那么刷新时就像初次加载了。或者,你把fun()放在window.onload=function(){fun();}再执行
    ==============================================
    我估计有一下因素:
    1、“在一组iframe框架前N(N>0)行代码运行一个js function(假设为fun());动态加载js(在head下append一个新的script结点,取其中的变量)”。这样加载JS会有个未知延时;而此时框架是否存在是未知的;几个未知因素造成一定的概率出问题;所以建议你在页面完全加载后再执行fun();2、页面缓存是否有影响,你自己测试一下;最好屏蔽页面缓存
      

  4.   

    用js动态给iframe 赋src 试试.跟在 类似于 doc.innerHTML =="<img src=\"1.gif\">"; 代码后面.应该是缓存引起的.
      

  5.   


    对的,严格讲不是乱,是串了,第二个显示和第一个一样的内容(或者说src)
      

  6.   

    不能动态给iframe赋值,应为这个iframe是第三方的广告代码。不想误导大家转向广告系统是否有问题,特意隐去了这方面的说明,用普通的src代替。iframe里面加载的是一个flash广告文件(swf格式)现在的问题是,不是想简单地解决问题了事,事实上我用的那两个临时解决方法到目前为止一直有用。但对于这种状况的成因不是很了解。希望共同探讨一下。
      

  7.   


    页面缓存已屏蔽(no-cache?)且没有做任何压缩处理。那个fun()会对他后面的iframe组构成以上提到的影响。当页面很大(34K,6屏),如果加载完执行js的话页面显示会有影响。
      

  8.   

    不用
        var doc = document.CreateElement("DIV");
        document.getElementById("cont").appendChild(doc);
        doc.innerHTML =="<img src=\"1.gif\">";直接这样写:
        document.getElementById("cont").innerHTML ="<img src=\"1.gif\">";
      

  9.   

    加载iframe的时候用appendChild插入元素改变了DOM的结构;刷新之后可能内存中还是存在上一次JS加载的控件,所以页面的DOM结构发生了变化,并不像是重新生成的。所以在重新加载页面的时候,首先判断要加载的控件是否存在,如果是存在则先删除。你这个问题让我想到了IE下的“内存泄露”。不过没试验过,以上只是个人猜想