【问题标题】:Can't access content of another frame in Chrome无法在 Chrome 中访问其他框架的内容
【发布时间】:2011-04-25 10:05:23
【问题描述】:

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

当第一帧完全加载并且所有 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;
    }
}

【问题讨论】:

  • +1 表示 Google Chrome 讨厌框架 :)
  • 那么自尊的 webdeveloper 还使用框架集吗?

标签: javascript google-chrome safari frames


【解决方案1】:

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

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

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

【讨论】:

  • 这仍然无法通过 if(!parent.frames["xsample"])
  • 只需使用 id's then - parent.document.getElementById - 至少你知道你有正确的元素。
【解决方案2】:

我通过以下方式解决了它:
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">

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      解决反框架集 cmets:批评使用框架的人并不能回答问题。其次,框架在某些方面比任何其他替代方案做得更好。

      所以问题不应该是“哪个自尊的网络开发人员使用框架集?”应该是:“哪个自尊的全功能浏览器不能正常支持?”答案之一显然是 Chrome。

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

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

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

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

      【讨论】:

      • 我的上述解决方法是: parent.frames["F01"].document 其中 ["F01"] 是父框架集中框架的名称,而不是其在层次结构中的编号。
      猜你喜欢
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多