我有两个框架。两个帧中的页面来自同一个域(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;
}
}
答案 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中本地工作,则需要使用某种解决方法。你必须要有创意。在某些情况下,就像你知道情境变量一样,你可以创建一个数组来处理各种可能性(否则当它不需要那么复杂时就是拖拽)。