2011-04-25 65 views
0

我有两个框架。两个帧中的页面来自同一个域(本地主机或活动域 - 均使用相同的协议)。无法访问Chrome中另一个框架的内容

第一帧需要访问第二帧(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总是假

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

+1 Google Chrome hating frames :) – 2011-04-25 10:09:15

+4

什么自我尊重的web开发者仍然使用框架集呢? – Halcyon 2011-04-25 10:12:09

回答

1

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

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

在不同的笔记上,千万不要做setTimeout("doMoreWork(), 1000)",因为这会强制VM使用eval来执行代码。
使用setTimeout(doMoreWork, 1000)这是正确方式来做到这一点。

+0

如果(!parent.frames [“xsample”])仍然无法通过 – derekcohen 2011-04-25 15:46:36

+0

只需使用id的 - parent.document.getElementById - 至少你知道你有正确的元素。 – 2011-04-25 17:18:38

0

我解决它由:
1.给予目标帧两者的名称和ID
2.将两个
3.测试的测试目标帧内的变量(finishedLoading)设定为真
(测试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"> 
简化0
+0

但丢帧 – gd1 2011-04-28 20:54:10

0

在Chrome中,访问window.frames [index]会为您提供一个Window对象,您可以从中访问诸如该框架内容中的文档之类的好东西。

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

这个bug无法通过名称使用window.frames [name]来访问Window对象,其他浏览器的做法应该被修复!

0

为了解决反框架评论:批评那些使用框架的人并没有回答这个问题。其次,有些框架比其他选择更好。

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

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

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

然而,当在服务器上运行它通常会正常工作。

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

+0

我对上述解决方法是: parent.frames [“F01”]文件 其中[“F01”]是在父框架,而不是其在层次结构中的号码的帧的名称。 – IconMatrix 2017-04-06 23:00:35