无法访问Chrome中其他相框的内容

时间:2011-04-25 10:05:24

标签: javascript google-chrome safari frames

我有两个框架。两个帧中的页面来自同一个域(localhost或实时域 - 都使用相同的协议)。

当第二帧完全加载并且任何onload JS函数完成时,第一帧需要访问第二帧(xsample)的元素。但第二帧需要一段时间才能加载。

<frameset cols="*,*" rows="*" border="0" framespacing="0">
    <frame src="picker.asp" name="xpicker" frameborder="no" marginwidth="15" marginheight="15">
    <frame src="doc.asp" name="xsample" frameborder="no" marginwidth="15" marginheight="15">
</frameset>

以下代码适用于IE和Firefox,但不适用于Chrome或Safari,其中parent.xsample始终为假

function startWork(){
if(isSurveyLoaded()==false){
    SL=setTimeout("startWork()",1000);
    return;
}
else{
    setTimeout("doMoreWork()",2000);
}
}

function isSurveyLoaded(){
    if(!parent.xsample){
        return false;
    }
    if(!parent.xsample.self.name){
        return false;
    }
    if(parent.xsample.document.readyState!='complete'){
        return false;
    }
    else{
        return true;
    }
}

4 个答案:

答案 0 :(得分:1)

使用parent.frames["xsample"]访问该框架。

global对象上的命名元素的隐式引用未标准化。

另一方面,永远不要setTimeout("doMoreWork(), 1000)",因为这会强制VM使用eval来执行代码。
使用setTimeout(doMoreWork, 1000)这是正确的方式。

答案 1 :(得分:0)

我解决了它:
1.给目标框架一个名称和一个id 2.测试两者 3.测试目标帧内的变量(finishedLoading)是否设置为true (在测试finishedLoading时,代码被改为使用===而不是==)

function isSurveyLoaded(){
  if(!(parent.frames["xsample"]  || parent.document.getElementById('xsample'))){
    return false;
  }
  else{
    if(parent.frames["xsample"]){
      target=parent.frames["xsample"];
    }
    else{
      target=parent.document.getElementById('xsample');
    }
  }
  if ((target.finishedLoading==='undefined') || (target.finishedLoading===false) ){
    return false;
  }
  else{
    return true;  
  }
}

现在使用

进行简化
<frame src="doc.asp" onload="frameisloaded(this)" name="xsample" id="xsample" frameborder="no" marginwidth="15" marginheight="15">

答案 2 :(得分:0)

在Chrome中,访问window.frames [index]可以获得一个Window对象,您可以从该对象中访问该框架内容中的文档。

通过document.getElementById访问它只返回iframe元素本身,几乎没有用于进一步挖掘DOM的有用属性。

使用window.frames [name]无法按名称访问Window对象的错误应该像其他浏览器一样修复!

答案 3 :(得分:0)

解决反框架集注释:批评那些使用框架的人并没有回答这个问题。其次,框架比其他任何替代方案都要好。

所以问题不应该是,“自我尊重的Web开发人员使用框架集是什么?”它应该是:“什么自尊的全功能浏览器不能正确支持它们?”其中一个答案显然是Chrome。

他们在解释器中的各种功能周围撒了“安全标志”,包括那些便于在不同帧中的页面之间传输某些信息的功能。因此,在本地运行时,这样的事情不起作用:

top.frames [2] .document.getElementById(ID)

但是,当在服务器上运行时,它通常可以正常工作。

如果您需要在Chrome中本地工作,则需要使用某种解决方法。你必须要有创意。在某些情况下,就像你知道情境变量一样,你可以创建一个数组来处理各种可能性(否则当它不需要那么复杂时就是拖拽)。