不能在Chrome中访问另一个框架的内容

Can't access content of another frame in Chrome

本文关键字:框架 另一个 访问 Chrome 不能      更新时间:2023-09-26

我有两个框架。两个帧中的页面都来自同一个域(本地主机或活动域—两者都使用相同的协议)。

第一帧需要访问第二帧(xsample)的元素,当它完全加载和任何onload JS函数已经完成。但是第二帧需要一些时间来加载。

<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总是false

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;
    }
}

使用parent.frames["xsample"]访问帧。

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

另一个注意,永远不要使用setTimeout("doMoreWork(), 1000)",因为这会迫使VM使用eval来执行代码。
使用setTimeout(doMoreWork, 1000),这是正确的方法。

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

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">

在Chrome中,访问Window .frames[index]可以获得一个Window对象,从中你可以访问好的东西,比如在该框架的内容内的文档。

按文档访问。getElementById只返回iframe元素本身,几乎没有任何有用的属性来进一步挖掘DOM。

不能像其他浏览器那样通过Window .frames[name]访问Window对象,这个bug应该修复!

对于反对框架集的评论:批评那些使用框架的人并不能回答问题。其次,框架在某些方面比其他任何选择都做得更好。

所以问题不应该是,"有自尊心的web开发人员会使用框架集吗?"它应该是:"有哪个自尊的全功能浏览器不支持它们?"答案之一显然是Chrome。

他们在解释器中的各种函数周围撒上了"安全标志",包括那些在不同帧的页面之间促进某些信息传输的函数。因此,这样的操作在本地运行时不起作用:

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

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

如果你需要它在Chrome本地工作,你需要使用某种解决方案。你必须要有创造力。在某些情况下,比如当您知道情境变量时,您可以创建一个数组来处理各种可能性(当它不需要那么复杂时,这是一个拖累)。